zoukankan      html  css  js  c++  java
  • 抽象工厂模式 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();
            }
        }
    

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

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

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

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

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

    (参考)

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

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

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

  • 相关阅读:
    张旭升20162329 2006-2007-2 《Java程序设计》第一周学习总结
    预备作业03——20162329张旭升
    预备作业02 : 体会做中学-20162329 张旭升
    预备作业01——20162329
    FPGA的软核与硬核
    网页调用vlc并播放网络视频
    vue视频插件VLC
    vue+vue-video-player实现弹窗播放视频
    【面向对象程序设计】作业三
    【面向对象程序设计】作业二
  • 原文地址:https://www.cnblogs.com/wangweiabcd/p/3905892.html
Copyright © 2011-2022 走看看