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


    抽象工厂模式概念:

    抽象工厂模式(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"/>
    
    
    那如果不用配置去控制那就需要多创建几种实现来完成了,我也不知道哪种更好,感觉多创建几种实现类来对应不同的操作会好些,但是又觉得那样会创建很多类,用配置信息来控制就会减少一些类
  • 相关阅读:
    javascript核心基础(正则专题)
    JsonUtil(工具类)
    身份证验证要用到的代码
    来cnblog了
    强智科技教务处模拟登录
    Thinkphp学习日记:jQuery_ajax数据提交
    在win8中使用服务器管理器来管理windows server 2012
    在windows server 2012运行锐捷客户端
    CentOS 6.4 配置LAMP 环境 与安装 phpmyadmin
    Linux下的光盘挂载与卸载
  • 原文地址:https://www.cnblogs.com/zhoulei0517/p/13850993.html
Copyright © 2020-2023  润新知