• 工厂方法模式


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

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

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

    (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();
            }
        }
    }
    通过上述我们可分析出,如果我想要台大众车,那么我就必须需要有条大众的生产线才行。因为大众车的生产在大众车的生产线上产出来。
     
  • 相关阅读:
    CTF-1-5题笔记
    无相劫指:Web安全之其他专题—第七天
    七伤拳:Web安全之文件包含漏洞专题—第六天
    CTF-输入密码查看flag -80
    工业级路由器采用的协议和功能
    PLC模拟量采集模块在工控领域的应用
    串口服务器的作用和工作原理是什么
    在PLC中开关量采集模块的作用
    4G DTU和4G工业路由器有哪些区别?
    应该怎么提升4G工业路由器的无线信号?
  • 原文地址:https://www.cnblogs.com/chyshx/p/10498840.html
Copyright © 2020-2023  润新知