泡妞之工厂设计模式

7in10笔记:泡妞之工厂方法模式
类关系图


类角色说明
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

意图
定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中

适用性
1、 当一个类不知道它所必须创建的对象的类的时候。
2、 当一个类希望由它的子类来指定它所创建的对象的时候。  
3、 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

泡妞的例子
FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了

泡妞的代码
using System;
using System.Collections;

//抽象产品(Product)角色
public abstract class Hamburger
  {
     public abstract void OK();
}

//具体产品(Concrete Product)角色
public class ChickenHamburger:Hamburger
  {
     public override void OK()
      {
         Console.WriteLine("来了,您的鸡肉汉堡!");
     }
}
//具体产品(Concrete Product)角色
public class BeefHamburger:Hamburger
  {
     public override void OK()
      {
         Console.WriteLine("类了,您的牛肉汉堡!");
     }
}

//抽象工厂(Creator)角色
public abstract class Waiter
  {
     public abstract Hamburger Create();
}

//具体工厂(Concrete Creator)角色
public class Chef_ChickenHamburger:Waiter
  {
     public override Hamburger Create()
      {
         Console.WriteLine("鸡肉汉堡制作中,请稍后……");
         return new ChickenHamburger();
     }
}

//具体工厂(Concrete Creator)角色
public class Chef_BeefHamburger:Waiter
  {
     public override Hamburger Create()
      {
         Console.WriteLine("牛肉汉堡制作中,请稍后……");
         return new BeefHamburger();
     }
}
public class KFC
  {
     public static void Main()
      {
         Waiter waiter=null;
         Hamburger hbg=null;
        
         Console.WriteLine("Andy喜欢鸡肉汉堡的!");
         waiter=new Chef_ChickenHamburger();
         hbg=waiter.Create();
         hbg.OK();
        
         Console.WriteLine("Mary喜欢牛肉汉堡的!");
         waiter=new Chef_BeefHamburger();
         hbg=waiter.Create();
         hbg.OK();
     }
    
}

工厂方法模式
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

优缺点
优点:当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。
缺点:通常一个产品对应一个工厂,较为烦琐,而且所有的产品都应该是一类别的,即应该有共同的接口

说明
一个工厂方法模式的实现依赖于工厂角色和产品角色的多态性。在有些情况下,这个模式可以出现退化。
工厂方法返回的类型应当是抽象类型,而不是具体类型。调用工厂方法的客户端应当依赖抽象产品编程,而不是具体产品。如果工厂仅仅返回一个具体产品对象,便违背了工厂方法的用意,发生退化,这时就不再是工厂模式了。
工厂的等级结构:工厂对象应当有一个抽象的超类型。如果等级结构中只有一个具体工厂类的话,抽象工厂就可以省略,发生了退化。

你可能感兴趣的:(设计模式,编程,工作)