• 抽象工厂模式 AbstractFactory---Design Pattern 2


    抽象工厂模式 AbstractFactory

    抽象工厂模式:提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类。

        //抽象工厂类“总部”AbstractFactory封装了一系列创建产品的接口
        //[优点]虽然提高了扩展性,[缺点]但在增加接口(新产品)时会涉及到所有子类的更改
        public abstract class AbstractFactory
        {
            public abstract ChineseFood CreateChineseFood();    //提供创建中餐的接口
            public abstract WestFood CreateWestFood();  //提供创建西餐的接口
        }
    
        //原来的“分工厂” 子类BeijingFactory负责实现北京特色产品的创建
        public class BeijingFactory : AbstractFactory
        {
            //产品的具体创建
            public override ChineseFood CreateChineseFood()
            {
                return new ChineseFoodBeijingStyle();   //返回北京特色的中餐
            }
            public override WestFood CreateWestFood()
            {
                return new WestFoodBeijingStyle();  //返回北京特色的西餐
            }
        }
        //新增的“分工厂” 子类WashingtonFactory负责实现华盛顿特色产品的创建
        public class WashingtonFactory : AbstractFactory
        {
            public override ChineseFood CreateChineseFood()
            {
                return new ChineseFoodWashingtonStyle();    //返回华盛顿特色的中餐
            }
            public override WestFood CreateWestFood()
            {
                return new WestFoodWashingtonStyle();   //返回华盛顿特色的西餐
            }
        }
    
        //中餐 抽象类
        public abstract class ChineseFood
        {
            public abstract void Print();
        }
        //西餐 抽象类
        public abstract class WestFood
        {
            public abstract void Print();
        }
    
        //原来的需求
        //中餐 北京特色 具体类
        public class ChineseFoodBeijingStyle : ChineseFood
        {
            public override void Print()
            {
                Console.WriteLine("北京特色的中餐!");
            }
        }
        //西餐 北京特色 具体类
        public class WestFoodBeijingStyle : WestFood
        {
            public override void Print()
            {
                Console.WriteLine("北京特色的西餐!");
            }
        }
    
        //新增的需求
        //中餐 华盛顿特色 具体类
        public class ChineseFoodWashingtonStyle : ChineseFood
        {
            public override void Print()
            {
                Console.WriteLine("华盛顿特色的中餐!");
            }
        }
        //西餐 华盛顿特色 具体类
        public class WestFoodWashingtonStyle : WestFood
        {
            public override void Print()
            {
                Console.WriteLine("华盛顿特色的西餐!");
            }
        }
    
        //程序调用入口(Main方法)
        class Program
        {
            static void Main(string[] args)
            {
                //原来的需求
                AbstractFactory beijingFactory = new BeijingFactory();
                beijingFactory.CreateChineseFood().Print();
                beijingFactory.CreateWestFood().Print();
                //新增的需求
                AbstractFactory washingtonFactory = new WashingtonFactory();
                washingtonFactory.CreateChineseFood().Print();
                washingtonFactory.CreateWestFood().Print();
                Console.ReadKey();
            }
        }
    

    抽象工厂对于系列产品的变化支持 “开放——封闭”原则(指的是要求系统对扩展开放,对修改封闭),扩展起来非常简便,但对于添加新产品这种情况就不支持”开放——封闭 “原则。

    抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么。这样客户就可以从具体产品中被解耦。

    抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。

    也就是说抽象工厂的使用范围是:

    某个具体工厂需要负责已确定的一系列产品(多元化)的创建工作。

    (参考)

    • 一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。

    • 这个系统有多个系列产品,而系统中只消费其中某一系列产品

    • 系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。

  • 相关阅读:
    Java实现 LeetCode 455 分发饼干
    Java实现 LeetCode 455 分发饼干
    Java实现 LeetCode 455 分发饼干
    Java实现 LeetCode 454 四数相加 II
    Java实现 LeetCode 454 四数相加 II
    Java实现 LeetCode 454 四数相加 II
    FFmpeg解码H264及swscale缩放详解
    linux中cat more less head tail 命令区别
    C语言字符串操作总结大全(超详细)
    如何使用eclipse进行嵌入式Linux的开发
  • 原文地址:https://www.cnblogs.com/wangweiabcd/p/3905892.html
Copyright © 2020-2023  润新知