设计模式C#实现(五)——抽象工厂模式

抽象工厂模式

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

UML类图:

场景:抽象村商店想销售Pizza和Hamburg等多种商品,而在美国店和中国店要出售本土化的口味

工厂接口定声明了要创建的产品接口

 interface Factory
    {
        AbstractHamburg createHamburg();
        AbstractPizza createPizza();
    }

具体的工厂创建具体产品

 class USAFactory : Factory
    {
        public AbstractHamburg createHamburg()
        {
            return new USAHamburg();
        }
         public AbstractPizza createPizza()
        {
            return new USAPizza();
        }
    }

抽象产品

 interface AbstractPizza
    {
          string getName();
    }
  interface AbstractHamburg
    {
          string getName();
    }

各地的具体产品的一个例子

class USAHamburg : AbstractHamburg
    {
         public string getName()
        {
            return "USAHamburg";
        }
    }
class USAPizza : AbstractPizza
    {
        public  string getName()
        {
            return "USAPizza";
        }
    }

商店

  class Store
    {
        public AbstractHamburg hamburg;
        public AbstractPizza pizza;
        public Store(Factory factory)
        {
            hamburg = factory.createHamburg();
            pizza = factory.createPizza();
        }
        public void sellPizza(){
            Console.WriteLine("Sell a "+pizza.getName());
        }
        public void sellHamburg()
        {
            Console.WriteLine("Sell a " + hamburg.getName());
        }
    }

运行

static void Main(string[] args)

{
  Factory factory = new USAFactory();
  Store store = new Store();
  store.sellPizza(factory);
  store.sellHamburg(factory);
  factory = new CNFactory();
  store.sellPizza(factory);
  store.sellHamburg(factory);
  Console.ReadKey();
}


运行结果

 效果:

1.分离了具体类    客户Store提供抽象接口操作实例,它不知道具体操作的是什么类(低耦合?)

2.易于改变系列    将USAFactory换成CNFactory就转换成生成另一个系列的产品(一秒换装)

3.有利于产品的一致性  一系列产品都是CN或者USA的(民族主义必备

4.难以支撑新种类的产品  Store想卖薯条就要修改抽象Factory和所有具体Factory(违反开闭原则?)

posted @ 2015-09-15 10:45  妖刀Dreamcast  阅读(267)  评论(0编辑  收藏  举报