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());
-
-
- // ...
-
-
- }
-
-
- }