24种常用设计模式
创建型模式:抽象工厂、生成器、工厂方法、原型、单例;
结构型模式:适配器、桥接、组合、装饰、外观、享元、代理;
行为模式:责任链、命令、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者;
工厂方法模式:是一种创建型设计模式,其在父类中指定一个创建对象的方法,允许子类决定实例化对象的类型。
使用场景
当你在编写代码时,如果无法确切预知对象的确切类别以及依赖关系时,可以选择使用工厂方法模式;
工厂方法将创建产品的代码和使用产品的代码分离,从而能在不影响其它代码的使用情况下扩展产品创建部分的代码;
如果你希望用户能够扩展你的软件库或框架内部组件;
工厂方法的优缺点
优点:可以避免创建者和具体产品之间的耦合;单一职责原则,将产品创建代码放在程序单一位置,使代码更容易维护;开闭原则,无需更改现有客户端代码,就可以在程序中引入新的产品功能。
缺点:需要引入许多新的子类,代码可能会变得复杂。
识别方法
工厂方法通过构建方法来识别,它会创建具体类的对象,但以抽象类型或接口的形式返回这些对象。
代码实现
工厂抽象类
abstract class Creator{public abstract IProduct FactoryMethod();public string SomeOperation(){var product = FactoryMethod();var result = "Creator: The same creator's code has just worked with " + product.Operation();return result;}}
具体工厂子类实现
class ConcreteCreator1 : Creator{public override IProduct FactoryMethod(){return new ConcreteProduct1();}}class ConcreteCreator2 : Creator{public override IProduct FactoryMethod(){return new ConcreteProduct2();}}
产品接口
public interface IProduct{string Operation();}
具体产品实现类
class ConcreteProduct1 : IProduct{public ConcreteProduct1() { }public string Operation(){return "Result of ConcreteProduct1";}}class ConcreteProduct2 : IProduct{public string Operation(){return "Result of ConcreteProduct2";}}
客户端
class Client{public void Main(){Debug.WriteLine("App: Launched with the ConcreteCreator1.");ClientCode(new ConcreteCreator1());Debug.WriteLine("");Debug.WriteLine("App: Launched with the ConcreteCreator2.");ClientCode(new ConcreteCreator2());}public void ClientCode(Creator creator){// ...Debug.WriteLine("Client: I'm not aware of the creator's class," +"but it still works.\n" + creator.SomeOperation());// ...}}