工厂方法模式

Posted chyshx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂方法模式相关的知识,希望对你有一定的参考价值。

简单工厂模式在种类较少的时候基本上可以满足了,但是缺点很明显,就是当你需要新增一种类型时,需要修改工厂的静态方法,以满足需求。如果需求一边多,这种设计带来的就是无尽的修改。比如,当前的工厂只能生产奔驰、宝马两种车,但是如果想新生产车的话,就不得不新增新种类车的生产线。

工厂方法模式,可以规避掉这种问题,工厂方法的根本其实就是把生产线(用来产车的真正逻辑)交出去,他的办法就是我只给你提供可以支撑生产线的地方,你要来产奔驰车,那你就自己带上奔驰生产线,意味着所有想用我场地生产汽车的,你自己的生产线做的大小跟我一样,我的场地才能放的下你的生产线,这算是一种约束。

通过上面的梳理,我们涉及到的对象其实就是四类:

(1)抽象的工厂:只提供可以安放生产线的地方;

(2)具体的工厂:可以实际生产具体产品的生产线(如:奔驰车生产线可以生产奔驰);

(3)抽象的车:所有车的一个抽象模型,如本例中“车”的概念;

(4)具体的车:是车的一种实现,是一个具体的被具体的生产线生产下来。

 理解了上述本质,我们知道,你要什么样的车,就得对应这么一个对应的生产线,这个生产线还要能放到我的工厂里(满足接口约束),不然没法生产。

具体实现可看下面代码(C#):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace codesniped
{
    /// <summary>
    /// 车工厂接口
    /// </summary>
    public interface ICarFactory
    {
        ICar CreateCar();
    }
    /// <summary>
    /// 车接口
    /// </summary>
    public interface ICar
    {
        void run();
    }
    /// <summary>
    /// 奔驰具体车,继承che接口
    /// </summary>
    public class BenzCar:ICar
    {
        public void run()
        {
            Console.WriteLine("Benz Car is Running...");
        }
    }
    /// <summary>
    /// 宝马具体车,继承车接口
    /// </summary>
    public class BmwCar:ICar
    {
        public void run()
        {
            Console.WriteLine("Bmw Car is Running...");
        }
    }
    /// <summary>
    /// 奔驰车工厂
    /// </summary>
    public class BenzCarFactory : ICarFactory
    {
        public ICar CreateCar()
        {
            return new BenzCar();
        }
    }
    /// <summary>
    /// 宝马车工厂
    /// </summary>
    public class BmwCarFactory:ICarFactory
    {
        public ICar CreateCar()
        {
            return new BmwCar();
        }
    }
}
 
测试代码如下:
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace codesniped
{
    class Program
    {
        static void Main(string[] args)
        {
            ICarFactory carFactory = new BmwCarFactory(); //要什么车,先安装对应的生产线
            ICar myCar = carFactory.CreateCar();//利用生产线,产车
            myCar.run();
            Console.ReadKey();
        }
    }
}
通过上述我们可分析出,如果我想要台大众车,那么我就必须需要有条大众的生产线才行。因为大众车的生产在大众车的生产线上产出来。
 

以上是关于工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

工厂设计模式

Java设计模式3:工厂方法模式

简单工厂工厂方法抽象工厂区别

设计模式之工厂方法模式

简单工厂方法,工厂模式,抽象工厂模式