软件设计模式之抽象工厂模式
抽象工厂模式概念:
抽象工厂模式(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"/>
那如果不用配置去控制那就需要多创建几种实现来完成了,我也不知道哪种更好,感觉多创建几种实现类来对应不同的操作会好些,但是又觉得那样会创建很多类,用配置信息来控制就会减少一些类

浙公网安备 33010602011771号