工厂方法模式

工厂方法模式

工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品;

抽象工厂角色

是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

具体工厂角色

这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。

抽象产品角色

工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。

具体产品角色

这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

适用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。

工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。

当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。

C# 代码实现

  1. 创建抽象产品类
//图形的接口
public interface IShape
{
    void Draw();
}
  1. 创建具体产品类
//正方形实现类
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");
    }
}
  1. 创建抽象工厂类
//图形抽象工厂
public interface IShapeFactory
{
    IShape GetShape();
}
  1. 创建工厂实现类
//圆形工厂
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();
    }
}
  1. 调用
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();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容