软件设计模式之抽象工厂模式

抽象工厂模式概念:

抽象工厂模式(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"/>


那如果不用配置去控制那就需要多创建几种实现来完成了,我也不知道哪种更好,感觉多创建几种实现类来对应不同的操作会好些,但是又觉得那样会创建很多类,用配置信息来控制就会减少一些类
原文地址:https://www.cnblogs.com/zhoulei0517/p/13850993.html