using System;
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();
Console.ReadLine();
}
}
上面的例子可以很形象的说明工厂设计模式,在main中已开始就创建了两条新的生产线:c1和c2,其中c1生产Bulb而c2生产Tube,从此以后就利用这两条生产线生产灯,在本例中的实际情况就是l1和l2这两盏灯。
那么现在就存在几个相互之间的关系问题:
1、Creator和BulbCreator之间的关系——BulbCreator是继承Creator的,其是在Creator的基础上进一步增加功能或者重写功能实现的。
2、BulbCreator和TubeCreator之间的关系——这两者应该是平等的关系,就像我们在同时生产两种产品,但是他们拥有一样的基础,就是Creator。
3、Light和Creator的之间的关系——我个人觉得这是最主要的关系,可以看到Creator返回的是一个new的对象,所以这里可以简单的认为Creator帮助我们实现了对象,Creator只是一个接口,提供了一个方法,在具体实现中我们可以定制我们的生产,就像给了我们钱,至于怎么用后面再说。
4、Creator和BulbCreator之间的关系——这里就实现了钱用在哪里的问题,也就是重载了函数,以便我们具体的使用
5、Light和BulbLight之间的关系——这里其实和4非常的像,我们也就不再多说了
6、BulbCreator和BulbLight之间的关系——一个需求,一个提供,比如我们想要BulbLight,那么就必须要先定义BulbCreator,然后生产BulbLight
其实我觉得上面的程序可以写的更加直白一点,即将Creator和Light分别写成BulbCreator和BulbLight,这样会更加明显一点。
相信搞清楚了这几组关系,那么对于工厂设计模式就不会那么陌生了。
优点:
这样我们可以先定义好Light,然后各自根据自己的需要继承Light,创造自己的light,然后再定义一个对应的Creator,用来生产对象,这样就不会和任何已经存在的对象产生冲突,有助于程序的扩展,而且人们也可以防止对已有代码的改动,有安全性。