日期:2014-05-18  浏览次数:21103 次

工厂模式的疑问
以下是一个工厂模式的代码
 public abstract class Light
  {
  public abstract void TurnOn();
  public abstract void TurnOff();
 }
 
 public class BulbLight : Light
  {
  public override void TurnOn()
  { Console.WriteLine("Bulb Light is Turned on"); }
 
  public override void TurnOff()
  { Console.WriteLine("Bulb Light is Turned off"); }
 }
 
 public class TubeLight : Light
  {
  public override void TurnOn()
  { Console.WriteLine("Tube Light is Turned on"); }
 
  public override void TurnOff()
  { Console.WriteLine("Tube Light is Turned off"); }
 }
 
 public abstract class Creator
  {
  public abstract Light factory();
 }
 
 public class BulbCreator : Creator
  {
  public override Light factory()
  { return new BulbLight(); }
 }
 
 public class TubeCreator : Creator
  {
  public override Light factory()
  { return new TubeLight(); }
 }
 
 public class Client
  {
  public static void Main()
  {
  Creator c1 = new BulbCreator();
  Creator c2 = new TubeCreator();
 
  Light l1 = c1.factory();
  Light l2 = c2.factory();
 
  l1.TurnOn();
  l1.TurnOff();
 
  Console.WriteLine("-----------------");
 
  l2.TurnOn();
  l2.TurnOff();
  }
 }
为什么一定要这么麻烦的来创建l1对象呢。通过BulbLight l1 = BulbLight.create()来创建实例不是更简单吗?如果后来又需要新增一中Light,我只需要再从Light中派生一个子类,这样不是也很简单吗?比较困惑,工厂模式到底有什么好处。


------解决方案--------------------
mark


------解决方案--------------------
mark


------解决方案--------------------
简单的说就是把确定类型和创建实例的时间分开(或者说延迟创建)
------解决方案--------------------
知道什么时候该创建实例的类 不需要知道应该创建那个类,因为通过工厂已经确定了
也就是这个类只依赖于抽象的产品和抽象的工厂,具体产品是什么类型,不需要关心

C# code
public class User
{
    public void Foo(IFactory f)
    {
       IProduct p = f.Create();
       // ...
    }
}

------解决方案--------------------
因为开始的时候不知道要创建什么对象,只好等到运行时再来确定
------解决方案--------------------
上面这个代码其实还没有充分发挥Class Factory的特点.

可以考虑一下, 比如你现在手里只有一个接口ILight, 其定义了Light的一些基本方法, 对于类厂而言, 你可以直接通过LightFactory来获取你所指定的类型的Light,然后让类厂返回一个ILight的实例给你. 而你可以完全不必要知道你所指定的那个类型的Ligh叫什么名字,以及如何实现. 

对于类厂的一个典型的实际例子就是COM。在COM中通过QI传入一个IID(一个GUID串),然后QI就可以返回给你一个接口对象回来。
------解决方案--------------------
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,
而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,
而不接触哪一个产品类被实例化这种细节。
这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
------解决方案--------------------
我感觉工厂方法要当作摸版方法的特例去理解应该就好理解了!
------解决方案--------------------
个人的理解:
比如你安排周一生产汽车,周二生产摩托车,
现在发明了一种两个轮子的汽车,但是你却不用动周一生产计划,这就是工厂模式的好处吧