工厂方法(Factory Method)模式又叫做多态性工厂(Polymorphic Factory)。
简单工厂模式的优缺点
优点:将类的创建逻辑从客户端移入工厂类。
缺点:对开-闭原则支持不够,如果有新类加入,必须修改工厂类的逻辑。
工厂方法克服了简单工厂模式的缺点,引入了多态性。
工厂方法和简单工厂的区别:
简单工厂模式的核心是一个具体类,工厂方法模式的核心是一个抽象类。
下面我们来看一下工厂方法的具体实现,我们还是以画图程序为例子。
图形的代码结构和简单工厂类似,读者可以参看简单工厂的代码,分别是IShape接口, Circle, Rectangle, Triangle类。
区别在于:
我们新定义了一个工厂接口,如下:
namespace designpattern.cs.FactoryMethod
{
public interface IShapeFactory
{
IShape Create();
}
}
{
public interface IShapeFactory
{
IShape Create();
}
}
这样,如果每增加一个新类,我们就增加一个工厂类,该工厂类实现工厂接口,如下:
namespace designpattern.cs.FactoryMethod
{
public class CircleFactory:IShapeFactory
{
public IShape Create()
{
return new Circle();
}
}
}
namespace designpattern.cs.FactoryMethod
{
public class RectangleFactory : IShapeFactory
{
public IShape Create()
{
return new Rectangle();
}
}
}
namespace designpattern.cs.FactoryMethod
{
public class TriangleFactory : IShapeFactory
{
public IShape Create()
{
return new Triangle();
}
}
}
{
public class CircleFactory:IShapeFactory
{
public IShape Create()
{
return new Circle();
}
}
}
namespace designpattern.cs.FactoryMethod
{
public class RectangleFactory : IShapeFactory
{
public IShape Create()
{
return new Rectangle();
}
}
}
namespace designpattern.cs.FactoryMethod
{
public class TriangleFactory : IShapeFactory
{
public IShape Create()
{
return new Triangle();
}
}
}
最后,在客户端中我们可以根据不同的工厂类来创建不同的业务类,如下:
using System;
namespace designpattern.cs.FactoryMethod
{
public class ClientDemo1
{
static void Main(string[] args)
{
IShape shape1,shape2,shape3;
IShapeFactory factory1,factory2,factory3;
//draw circle
factory1 = new CircleFactory();
shape1 = factory1.Create();
shape1.draw();
shape1.erase();
//draw rectangle
factory2 = new RectangleFactory();
shape2 = factory2.Create();
shape2.draw();
shape2.erase();
//draw triangle
factory3 = new TriangleFactory();
shape3 = factory3.Create();
shape3.draw();
shape3.erase();
Console.ReadLine();
}
}
}
namespace designpattern.cs.FactoryMethod
{
public class ClientDemo1
{
static void Main(string[] args)
{
IShape shape1,shape2,shape3;
IShapeFactory factory1,factory2,factory3;
//draw circle
factory1 = new CircleFactory();
shape1 = factory1.Create();
shape1.draw();
shape1.erase();
//draw rectangle
factory2 = new RectangleFactory();
shape2 = factory2.Create();
shape2.draw();
shape2.erase();
//draw triangle
factory3 = new TriangleFactory();
shape3 = factory3.Create();
shape3.draw();
shape3.erase();
Console.ReadLine();
}
}
}
总结:工厂方法更好地支持了“开-闭”原则: 对修改关闭,对增加开放。
因此,每增加一个业务类,我们改变了以往修改工厂类逻辑的做法,因为在实际项目中,工厂类
可能已经很复杂了,修改容易出错,引起连锁反应。因此,我们选择增加工厂类。
在工厂方法中,业务类和工厂类一一对应,数量相等,而工厂类都实现某个抽象接口,具有统一的原型。