定义
工厂模式是为创建对象提供接口, 以便把创建对象的具体过程隔离起来, 封装变化, 提高创建的通用性
分类
工厂模式包含以下三种分类:
简单工厂
工厂模式
抽象工厂
简单工厂
简单工厂又叫静态工厂方法 (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 应用
三者区别:
简单工厂模式: 是把产品创建统移到统一的工厂方法中去, 从而解耦了产品的创建依赖具体的产品
工厂模式: 为创建对象定义一个接口, 而由子类决定产品的创建对象的创建是在子类中完成
抽象工厂模式: 为某一系列或具有依赖关系的产品创建定义接口, 而不需要分别为各个产品的创建指定具体的类工厂模式只提供单一产品, 抽象工厂是对工厂模式的升级, 抽象工厂是在工厂模式的基础上提供一系列或具有依赖关系的商品
来源: https://www.cnblogs.com/hbb0b0/p/8528709.html