zoukankan      html  css  js  c++  java
  • 设计模式 创建型-工厂模式

    定义

    工厂模式是为创建对象提供接口,以便把创建对象的具体过程隔离起来,封装变化,提高创建的通用性。

     

    分类

    工厂模式包含以下三种分类:

    • 简单工厂
    • 工厂模式
    • 抽象工厂

     

    简单工厂

    简单工厂又叫静态工厂方法(Static Factory Method),它是把产品的创建移到统一的工厂方法中去,而不是把产品创建依赖具体产品使用new来创建。

     

    类图如下:

     

     

     

    场景:我们需要生产共享单车,目前市场上有膜拜单车与小黄车两种产品可供选择。市场上有家代理生产自行车工厂就叫 SimpleBikeFactory,只要给它单车标签,他就会按要求生产膜拜单车或小黄车。

    如果那天要生产小绿车, SimpleBikeFactory 只要调整他中的逻辑,就可以满足需要了。

     

    • 代码
    namespace hbb0b0.DesignPattern
    {
        /// <summary>
        /// 自行车接口
        /// </summary>
        public interface IBike
        {
    
        }
    
        /// <summary>
        /// 膜拜单车
        /// </summary>
        public class MoBike : IBike
        {
            public MoBike()
            {
                Console.WriteLine("MoBike");
            }
        }
    
        /// <summary>
        /// 小黄车
        /// </summary>
        public class OfOBike : IBike
        {
            public OfOBike()
            {
                Console.WriteLine("OfOBike");
            }
        }
    
        /// <summary>
        /// 简单单车生产工厂
        /// </summary>
        public class SimpleBikeFactory
        {
            public static IBike GetBike(string bikeName)
            {
                switch (bikeName)
                {
                    case "MO":
                        return new MoBike();
                    
                    case "OFO":
                        return new OfOBike();
                        
                    default:
                        return new MoBike();
                        
                }
            }
        }
    }
    namespace hbb0b0.DesignPattern.SimpleFactory
    {
        /// <summary>
        /// SimpleFactoryApp
        /// </summary>
        public class SimpleFactoryApp : IMain
        {
            public void Test()
            {
                //创建膜拜单车
                IBike moBike = SimpleBikeFactory.GetBike("MO");
    
                //创建小黄车
                IBike ofoBike = SimpleBikeFactory.GetBike("OFO");
            }
        }
    }
    • 优点

    本来生产单车的代码

    小黄车 OfOBike ofoBike =new OfOBike();

    膜拜单车 MoBike moBike = new MoBike();

    现在把生产单车对具体单车的依赖移到了静态工厂方法,封装了创建单车的变化,避免了创建单车代码分散到各个地方,便于单车创建逻辑的维护与修改。

     

    • .net 中的使用

     

    Encoding 中的 GetEncoding方法就是简单工厂,它就是根据传入标识来确定生成那种Encoding。

     

    工厂方法模式:

    为创建对象定义一个接口,让子类来决定哪一个类需要进行实例化,工厂模式允许一个类把实例化过程委托给子类。

     

    类图

     

     

     

    代码如下:

    namespace hbb0b0.DesignPattern.FactoryMethod
    {
        /// <summary>
        /// 单车接口
        /// </summary>
        public interface IBike
        {
        }
        /// <summary>
        /// 膜拜单车
        /// </summary>
        public class MoBike:IBike
        {
        }
        /// <summary>
        /// 小黄车
        /// </summary>
        public class OfOBike:IBike
        {
        }
    
        /// <summary>
        /// 单车工厂接口
        /// </summary>
        public interface IBikeFactory
        {
            /// <summary>
            /// 获取单车
            /// </summary>
            /// <returns></returns>
            IBike GetBike();
        }
       /// <summary>
        /// 膜拜单车工厂
        /// </summary>
        public class MoBikeFactory : IBikeFactory
        {
            public IBike GetBike()
            {
                return new MoBike();
            }
        }
       /// <summary>
        /// 小黄车工厂
        /// </summary>
        public class OfOBikeFactory : IBikeFactory
        {
            public IBike GetBike()
            {
                return new OfOBike();
            }
        }
    }

    使用

    namespace hbb0b0.DesignPattern.AbstractFactory
    {
        public class AbstractFactoryApp : IMain
        {
            public void Test()
            {
    
                //生产膜拜系列产品:单车与电动车
                IBikeFactory moFactory = new MoBikeFactory();
                
                IBike moBike=  moFactory.GetBike();
                IElectricBike moElectric =  moFactory.GetElectricBike();
    
                //生产小黄车系列产品:单车与电动车
                IBikeFactory ofoFactory = new OfOBikeFactory();
                IBike ofoBike = ofoFactory.GetBike();
                IElectricBike ofoElectric = ofoFactory.GetElectricBike();
    
            }
        }
    }

     

    .net 使用工厂模式

     

     

     

    抽象工厂:

    定义为创建相关或具有依赖关系的对象族提供一个接口,而无需分别为这些对象指定具体的类。

    抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么。

     

     

     

     

    代码

    namespace hbb0b0.DesignPattern.AbstractFactory
    {
        /// <summary>
        /// 电动车接口
        /// </summary>
        public interface IElectricBike
        {
        }
    
    /// <summary>
        /// 抽象工厂
        /// (提供多种产品)
        /// </summary>
        public interface IBikeFactory
        {
            /// <summary>
            /// 获取自行车接口
            /// </summary>
            /// <returns></returns>
            IBike GetBike();
    
            /// <summary>
            /// 获取电动车接口
            /// </summary>
            /// <returns></returns>
            IElectricBike GetElectricBike();
        }
    }
        /// <summary>
        /// 膜拜自行车工厂
        /// </summary>
        public class MoBikeFactory : IBikeFactory
        {
            public IBike GetBike()
            {
                return new MoBike();
            }
    
            public IElectricBike GetElectricBike()
            {
                return new MoElectricBike();
            }
        }
    }
        
        //小黄车自行车工厂
        public class OfOBikeFactory : IBikeFactory
        {
            public IBike GetBike()
            {
                return new OfOBike();
            }
    
            public IElectricBike GetElectricBike()
            {
                return  new OfOElectricBike();
            }
        }
    }

    使用

     

    namespace hbb0b0.DesignPattern.AbstractFactory
    {
        public class AbstractFactoryApp : IMain
        {
            public void Test()
            {
    
                //生产膜拜系列产品:单车与电动车
                IBikeFactory moFactory = new MoBikeFactory();
                
                IBike moBike=  moFactory.GetBike();
                IElectricBike moElectric =  moFactory.GetElectricBike();
    
                //生产小黄车系列产品:单车与电动车
                IBikeFactory ofoFactory = new OfOBikeFactory();
                IBike ofoBike = ofoFactory.GetBike();
                IElectricBike ofoElectric = ofoFactory.GetElectricBike();
    
            }
        }
    }
    • .net 应用

     

    三者区别:

    简单工厂模式:是把产品创建统移到统一的工厂方法中去,从而解耦了产品的创建依赖具体的产品。

    工厂模式:为创建对象定义一个接口,而由子类决定产品的创建。对象的创建是在子类中完成。

    抽象工厂模式:为某一系列或具有依赖关系的产品创建定义接口,而不需要分别为各个产品的创建指定具体的类。工厂模式只提供单一产品,抽象工厂是对工厂模式的升级,抽象工厂是在工厂模式的基础上提供一系列或具有依赖关系的商品。

     

  • 相关阅读:
    ffmpeg中的sws_scale算法性能测试
    ffmpeg 新老接口问题及对照集锦
    入门视频采集与处理(显示YUV数据)
    RGB与YUV图像视频格式的相互转换
    ffmpeg视频解码简明教程
    FFmpeg源代码简单分析——sws_getContext()
    FFmpeg解码H264及swscale缩放详解
    我所理解的ThreadLocal
    网络通信Socket模块实现文件传输
    设计一个基于flask的高并发高可用的查询ip的http服务
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/8528709.html
Copyright © 2011-2022 走看看