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