• 抽象工厂模式


            在工厂方法模式中,我们以造电脑为例,但实际上华为联想不仅造电脑,还造手机,如果完全新建一个造手机的工厂,势必会增加很多重复工作。这里用抽象工厂方法会简化很多,你可以想象为造电脑的工厂同时也可以造手机。

    目录

    1.UML图

    2.案例

    3.小结

    3.1 要点

    3.2 优缺点



    1.UML图

     ProductA1和ProductB1是一个系列,ProductA2和ProductB2是另一个系列。ConcreteFactory1是创建系列1的工厂方法,ConcreteFactory2是创建系列2的工厂方法。

    也就是A代表电脑,B代表手机。

    可以看出,在抽象工厂模式的结构图有以下角色:

    (1)、抽象产品类角色(AbstractProduct):为抽象工厂中相互依赖的每种产品定义抽象接口对象,也可以这样说,有几种产品,就要声明几个抽象角色,每一个抽象产品角色和一种具体的产品相匹配。
    (2)、具体产品类(ConcreteProduct):具体产品类实现了抽象产品类,是针对某个具体产品的实现的类型。
    (3)、抽象工厂类角色(Abstract Factory):定义了创建一组相互依赖的产品对象的接口操作,每种操作和每种产品一一对应。
    (4)、具体工厂类角色(ConcreteFactory):实现抽象类里面的所有抽象接口操作,可以创建某系列具体的产品,这些具体的产品是“抽象产品类角色”的子类。

    2.案例

             重复工厂方法模式的代码就不贴了。

            首先是增加Iphone以及具体的手机类。

    1. internal interface IPhone
    2. {
    3. public void Call(string name);
    4. public void Receive(string name);
    5. }
    6. internal class HuaWeiPhone : IPhone
    7. {
    8. public void Call(string name)
    9. {
    10. Console.WriteLine("you use HUAWEI phone call >>>>>>>> "+name);
    11. }
    12. public void Receive(string name)
    13. {
    14. Console.WriteLine("you HUAWEI phone get called <<<<<<< " + name);
    15. }
    16. }
    17. internal class LenovePhone : IPhone
    18. {
    19. public void Call(string name)
    20. {
    21. Console.WriteLine("you use Lenove phone call --------> " + name);
    22. }
    23. public void Receive(string name)
    24. {
    25. Console.WriteLine("you Lenove phone get called <------- " + name);
    26. }
    27. }

    抽象工厂有点变化:

    1. internal abstract class Factory
    2. {
    3. public abstract IPhone CreatePhone();
    4. public abstract IComputer CreatePc();
    5. }

    华为联想工厂多了新的产品线:

    1. internal class HuaWeiFactory:Factory
    2. {
    3. public override IPhone CreatePhone()
    4. {
    5. return new HuaWeiPhone();
    6. }
    7. public override IComputer CreatePc()
    8. {
    9. return new HuaweiComputer();
    10. }
    11. }
    12. internal class LenoveFactory : Factory
    13. {
    14. public override IPhone CreatePhone()
    15. {
    16. return new LenovePhone();
    17. }
    18. public override IComputer CreatePc()
    19. {
    20. return new LenovoComputer();
    21. }
    22. }

    最后随便写一个客户端类:

    1. internal class Client
    2. {
    3. private IComputer computer;
    4. private IPhone phone;
    5. public Client(Factory factory)
    6. {
    7. computer = factory.CreatePc();
    8. phone = factory.CreatePhone();
    9. }
    10. public void Buy()
    11. {
    12. computer.Start();
    13. phone.Call("hello world!");
    14. }
    15. }

    3.小结

    3.1 要点

    • 如果没有应对“多系列对象创建”的需求变化,则没有必要使用AbstractFactory模式,这时候使用简单的静态工厂完全可以。也就是你只有一种产品,且没变化,直接用最简单的工厂模式就好。
    • “系列对象"指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中“道路”与“房屋”的依赖,“道路”与“地道”的依赖。
    • AbstractFactory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。
    • AbstractFactory模式经常和FactoryMethod模式共同组合来应对“对象创建”的需求变化。比如后面还要生产平板电脑,就需要两者进行修改。

    3.2 优缺点

            【抽象工厂】模式将系列产品的创建工作延迟到具体工厂的子类中,我们声明工厂类变量的时候是使用的抽象类型,同理,我们使用产品类型也是抽象类型,这样做就尽可能的可以减少客户端代码与具体产品类之间的依赖,从而降低了系统的耦合度。耦合度降低了,对于后期的维护和扩展就更有利,这也就是【抽象工厂】模式的优点所在。可能有人会说在Main方法里面(这里的代码就是客户端的使用方)还是会使用具体的工厂类,对的。这个其实我们通过Net的配置,把这部分移出去,最后把依赖关系放到配置文件中。如果有新的需求我们只需要修改配置文件,根本就不需要修改代码了,让客户代码更稳定。依赖关系肯定会存在,我们要做的就是降低依赖,想完全去除很难,也不现实。

            有优点肯定就有缺点,因为每种模式都有他的使用范围,或者说要解决的问题,不能解决的问题就是缺点了,其实也不能叫缺点了。【抽象工厂】模式很难支持增加新产品的变化,这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。


    完整代码:DesignPatterReview

  • 相关阅读:
    视频监控平台是如何运作的?EasyCVR视频汇聚平台的高效策略与实践
    rsync远程同步
    OpenSSL 针对2个新的高严重性漏洞发布补丁
    生产制造管理系统对中小型企业的作用有哪些?
    2分钟明白异或运算
    ThreadLocal 原理
    Flutter 下载篇 - 叁 | 网络库切换实践与思考
    ros-noetic采集单目USB相机数据
    游戏出海,全球化运营
    [项目管理-2]:软硬件项目管理 - 干系人管理、实践活动、常见工具
  • 原文地址:https://blog.csdn.net/q__y__L/article/details/126301058