简单工厂、工厂方法、抽象工厂 大三工厂 都是创建型设计模式,都是管理对象如何创建。
简单工厂简单到令人发指,只是包了一层,但是做到了逻辑转移。上端不在关心对象怎么创建,稳定了调用方
比如我们下单的时候,购买什么产品,需要创建什么样的对象,水果为例子,有
有苹果apple 葡萄 grape 橙子orange 三个对象 他们都继承了 下单的这个动作
public class Apple : IOrder { public void GetOrder() { Console.WriteLine($"苹果下单{this.GetType().Name}"); } }
public class Orange : IOrder { public void GetOrder() { Console.WriteLine($"橙子下单{this.GetType().Name}"); } }
调用苹果下单 创建苹果的对象
IOrder order = new Apple(); order.GetOrder();
如果是橙子下单 我们客户端还需要修改如上代码,这违背开闭原则。因此我们需要转移,于是有了个工厂的概念,专门生成对象
public class Factory { public static IOrder CreateFactory(OrderType orderType) { IOrder iorder = null; switch (orderType) { case OrderType.Grape: iorder = new Grape(); break; case OrderType.Apple: iorder = new Apple(); break; case OrderType.Orange: iorder = new Orange(); break; default: throw new Exception("error "); } return iorder; } } public enum OrderType { Apple, Orange, Grape }
上端调用变成了
cw("*****************************工厂方法*************************************")
工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,屏蔽了简单工厂的细节,也很好地符合了开放封闭原则。
创建工厂类的接口
internal interface ICreateFactory { public IOrder GetOrderFactory(); }
internal class AppleFactory : ICreateFactory { public virtual IOrder GetOrderFactory() { Console.WriteLine("额外加点逻辑"); return new Apple(); } }
上端调用
工厂方法为我们扩展,成为可能 net 5 种autofac 替换容器 思路 就是替换工厂
***************************抽象工厂********************************
抽象工厂是为了实现一类产品或者产品簇而产生。
工厂方法+ 抽象--是必须全部实现的:方便扩展种族 但是不能扩展产品簇--倾斜性可扩展性设计
internal abstract class abstractOrder { public abstract IOrder GetOrder(); public abstract IPay GetPay(); }
internal class abstracFactorys:abstractOrder { public override IOrder GetOrder() { return new Apple(); } public override IPay GetPay() { return new ApplePay(); } }