抽象工厂模式 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();
        }
    }

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

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

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

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

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

(参考)

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

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

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

posted @ 2014-08-11 23:03  蜂蜜柚子  阅读(135)  评论(0编辑  收藏  举报