工厂方法模式
工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品;
抽象工厂角色
是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂角色
这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
抽象产品角色
工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品角色
这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
适用场景
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。
工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。
当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。
C# 代码实现
- 创建抽象产品类
//图形的接口
public interface IShape
{
void Draw();
}
- 创建具体产品类
//正方形实现类
public class Square : IShape
{
public void Draw()
{
Console.WriteLine($"{this.GetType().Name} >>> Draw");
}
}
//长方形实现类
public class Rectangle : IShape
{
public void Draw()
{
Console.WriteLine($"{this.GetType().Name} >>> Draw");
}
}
//圆形实现类
public class Circle : IShape
{
public void Draw()
{
Console.WriteLine($"{this.GetType().Name} >>> Draw");
}
}
- 创建抽象工厂类
//图形抽象工厂
public interface IShapeFactory
{
IShape GetShape();
}
- 创建工厂实现类
//圆形工厂
public class CircleFactory : IShapeFactory
{
public IShape GetShape()
{
return new Circle();
}
}
//长方形工厂
public class RectangleFactory : IShapeFactory
{
public IShape GetShape()
{
return new Rectangle();
}
}
//正方形工厂
public class SquareFactory : IShapeFactory
{
public IShape GetShape()
{
return new Square();
}
}
- 调用
class Program
{
static void Main(string[] args)
{
IShapeFactory shapeFactory1 = new SquareFactory();
IShape shape1 = shapeFactory1.GetShape();
shape1.Draw();
IShapeFactory shapeFactory2 = new RectangleFactory();
IShape shape2 = shapeFactory2.GetShape();
shape2.Draw();
IShapeFactory shapeFactory3 = new CircleFactory();
IShape shape3 = shapeFactory3.GetShape();
shape3.Draw();
Console.ReadKey();
}
}