设计模式之六:工厂方法模式(Factory method Pattern)
工厂方法(Factory Method)模式就是定义一个创建对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责具体产品的创建,仅提供了具体工厂子类必须实现的接口,这样核心类成为一个抽象工厂角色,这样做的好处是工厂方法模式可以使系统在不修改具体工厂角色的情况下进行引进新的产品。
在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。
从上图可以看出,工厂方法模式有四个角色:
- 抽象工厂角色(ICreator):是工厂方法模式的核心,与应用程序无关。任何在模式中创建对象的工厂类必须实现这个接口。
- 具体工厂(Concrete Creator)角色: 这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象,在上图中有两个这些的角色:BulbCreator与TubeCreator.
- 抽象产品(Product)角色:工厂方法模式所创建对象的接口,也就是产品对象的共同接口。在上图中就是ILight。
- 具体产品(Concrete Product)角色: 这个角色实现了抽象产品角色多定义的接口,具体产品有专门的具体工厂创建,它们之间往往一一对应。
具体实现代码如下:
public interface ICreator
{
ILight Factory();
}
public interface ILight
{
void TurnOn();
void TurnOff();
}
public class TubeLight : ILight
{
public void TurnOn()
{
Console.WriteLine("TubeLight TurnOn");
}
public void TurnOff()
{
Console.WriteLine("TubeLight TurnOff");
}
}
public class BulbLight : ILight
{
public void TurnOn()
{
Console.WriteLine("BulbLight TurnOn");
}
public void TurnOff()
{
Console.WriteLine("BulbLight TurnOff");
}
}
public class BulbCreator : ICreator
{
public ILight Factory()
{
return new BulbLight();
}
}
public class TubeCreator : ICreator
{
public ILight Factory()
{
return new TubeLight();
}
}
public class Test
{
public static void Main()
{
ICreator create1 = new BulbCreator();
ILight light = create1.Factory();
light.TurnOn();
light.TurnOff();
create1 = new TubeCreator();
light = create1.Factory();
light.TurnOn();
light.TurnOff();
}
}
工厂方法模式与简单工厂模式在结构上区别是:工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式的具体工厂类都有一个共同的接口,所以工厂方法模式也叫多态性工厂模式。
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,很好的符合了“开放封闭“原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
工厂方法模式退化后可以演变成简单工厂模式。