软件设计模式之抽象工厂模式
抽象工厂模式概念:
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂优点:
主要解决了接口选择的问题;在系统的产品有多于一个的产品族,而系统只消费其中某一族的产品时使用抽象工厂。
实现:
这里我做了一个衣服搭配的例子,首先衣服种类是一个简单工厂,然后衣服颜色是一个简单工厂;最后再来个抽象工厂来对所有的工厂进行管理;
首先衣服种类简单工厂实现:
服装接口: public interface IClothing { /// <summary> /// 获取服装 /// </summary> /// <returns></returns> string GetClothing(); } 实现服装接口: /// <summary> /// 夹克类 /// </summary> public class Jacket:IClothing { public string GetClothing() { return "夹克"; } } /// <summary> /// 牛仔衣 /// </summary> public class JeansWear:IClothing { public string GetClothing() { return "牛仔衣服"; } } 然后枚举控制: public enum ClothingEnum { jacket,//夹克 JeansWear,//牛仔衣 } 然后简单工厂: /// <summary> /// 对服装进行统一管理的工厂类 /// </summary> public class FacClothing { private static IClothing cloth; public static IClothing GetClothing(ClothingEnum clo) { switch (clo) { case ClothingEnum.jacket://夹克 cloth = new Jacket(); break; case ClothingEnum.JeansWear://牛仔衣 cloth = new JeansWear(); break; } return cloth; } }
然后颜色工厂实现:
颜色接口: /// <summary> /// 颜色接口 /// </summary> public interface IColor { string GetColor(); } 实现颜色接口: /// <summary> /// 绿色 /// </summary> public class Green:IColor { public string GetColor() { return "绿色"; } } /// <summary> /// 黄色 /// </summary> public class Yellow:IColor { /// <summary> /// 颜色 /// </summary> /// <returns></returns> public string GetColor() { return "黄色"; } } 枚举控制: public enum ColorEnum { yellow,//黄色 green//绿色 } 颜色简单工厂: /// <summary> /// 颜色工厂类 /// </summary> public class FacColor { private static IColor color; public static IColor GetColor(ColorEnum col) { switch (col) { case ColorEnum.yellow: color = new Yellow(); break; case ColorEnum.green:color = new Green();break; } return color; } }
到这里颜色,服装已经可以全局进行更改了,那么有一个问题,如果要进行统一搭配呢?比如qq的换皮肤,一换换一整套的;或者说空调配置,修改空调配置有几种方式,如tcp、udp,如组播、广播;如485、以太网;要想进行统一调配就需要再建一共大工厂,对这些小工厂进行管理;
首先定义抽象工厂接口: /// <summary> /// 抽象工厂 /// </summary> public interface IFactory { /// <summary> /// 获取颜色 /// </summary> /// <returns></returns> IColor GetColor(); /// <summary> /// 获取衣服 /// </summary> /// <returns></returns> IClothing GetClothing(); } 然后实现它: public class WithA : IFactory { string type = System.Configuration.ConfigurationManager.AppSettings["AbstractFication"].ToString(); /// <summary> /// 根据配置获取颜色搭配 /// </summary> /// <returns></returns> public IColor GetColor() { IColor color = null; switch (type) { case "1": color = FacColor.GetColor(ColorEnum.green); break; case "2": color = FacColor.GetColor(ColorEnum.yellow); break; } return color; } /// <summary> /// 根据配置获取衣服搭配 /// </summary> /// <returns></returns> public IClothing GetClothing() { IClothing clothing = null; switch (type) { case "1": clothing = FacClothing.GetClothing(ClothingEnum.jacket); break; case "2": clothing = FacClothing.GetClothing(ClothingEnum.JeansWear); break; } return clothing; } } 上面这里呢我是直接用配置进行控制的: <!--抽象工厂类参数 1为搭配一--> <add key="AbstractFication" value="1"/>
那如果不用配置去控制那就需要多创建几种实现来完成了,我也不知道哪种更好,感觉多创建几种实现类来对应不同的操作会好些,但是又觉得那样会创建很多类,用配置信息来控制就会减少一些类