zoukankan      html  css  js  c++  java
  • 设计模式——抽象工厂模式(Abstract Factory)

    简单工厂模式: 简单工厂模式的工厂类随着产品类的增加需要增加额外的代码

    工厂方法模式: 工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性 但是在实际应用中,一个工厂不止会创建单一的产品,因为现在的工厂都多元化了,一个工厂创建一系列的产品,这就引入了抽象工厂的概念。

    抽象工厂模式 :   抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    区别

    简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

    工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   

    抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)  

    实例: 在一个生产显示屏幕和手机的工厂中,不同的流水线生产的产品不同。有的流水线生产显示器,有的生产手机。而且每条线上生产的显示器和手机品牌也不一样。下面用代码实现

    AbstractFactory抽象工厂类

     1    public abstract class AbstractFactorys
     2     {
     3         /// <summary>
     4         /// 获取屏幕产品
     5         /// </summary>
     6         /// <returns></returns>
     7         public abstract Screen screen();
     8         /// <summary>
     9         /// 获取手机产品
    10         /// </summary>
    11         /// <returns></returns>
    12         public abstract Mobile Mobile();
    13     }

    显示器屏幕抽象类和手机抽象类(可以理解为手机流水线和显示器流水线)

    1    /// <summary>
    2     /// 屏幕抽象类
    3     /// </summary>
    4     public abstract class Screen
    5     {
    6         public abstract void DisplayScreen();
    7     }
    1     /// <summary>
    2     /// 手机抽象类
    3     /// </summary>
    4     public abstract class Mobile
    5     {
    6         public abstract void DisplayMobile();
    7     }

    生产的LG品牌的手机和屏幕

     1     /// <summary>
     2     /// LG 手机类输出
     3     /// </summary>
     4     public class _LGPhone : Mobile
     5     {
     6         public override void DisplayMobile()
     7         {
     8             Console.WriteLine("生产LG手机");
     9         }
    10     }
     1     /// <summary>
     2     /// LG屏幕输出
     3     /// </summary>
     4     public class _LGScreen : Screen
     5     {
     6         public override void DisplayScreen()
     7         {
     8             Console.WriteLine("生产LG屏幕");
     9         }
    10     }

    生产的三星(Samsung)品牌的手机和屏幕

     1     /// <summary>
     2     /// 三星手机输出
     3     /// </summary>
     4     public class _SamsungPhone : Mobile
     5     {
     6         public override void DisplayMobile()
     7         {
     8             Console.WriteLine("生产三星手机");
     9         }
    10     }
     1     /// <summary>
     2     /// 三星屏幕输出
     3     /// </summary>
     4     public class _SamsungScreen : Screen
     5     {
     6         public override void DisplayScreen()
     7         {
     8             Console.WriteLine("生产三星屏幕");
     9         }
    10     }

    通过LG实例工厂得到LG品牌手机和显示器的实例

        /// <summary>
        /// LG生产工厂
        /// </summary>
        public class LGFactory : AbstractFactorys
        {
            /// <summary>
            /// 获取LG生产的手机
            /// </summary>
            /// <returns></returns>
            public override Mobile Mobile()
            {
                return new _LGPhone();
            }
            /// <summary>
            /// 获取LG生产的屏幕
            /// </summary>
            /// <returns></returns>
            public override Screen screen()
            {
                return new _LGScreen();
            }
        }

    通过三星(Samsung)实例工厂得到LG品牌手机和显示器的实例

        /// <summary>
        /// 三星实例工厂
        /// </summary>
        public class SamsungFactory : AbstractFactorys
        {
            /// <summary>
            /// 三星生产的手机
            /// </summary>
            /// <returns></returns>
            public override Mobile Mobile()
            {
                return new _SamsungPhone();
            }
            /// <summary>
            /// 三星生产的屏幕
            /// </summary>
            /// <returns></returns>
            public override Screen screen()
            {
                return new _SamsungScreen();
            }
        }

    测试输出:

    class Program
        {
            static void Main(string[] args)
            {
                //输出三星的产品
                AbstractFactorys samsung = new SamsungFactory();
                Mobile _samsungMobile = samsung.Mobile();
                Screen _samsungScreen = samsung.screen();
                _samsungMobile.DisplayMobile();
                _samsungScreen.DisplayScreen();
    
                //输出LG的产品
                AbstractFactorys lg = new LGFactory();
                Mobile _lgMobile = lg.Mobile();
                Screen _lgScreen = lg.screen();
                _lgMobile.DisplayMobile();
                _lgScreen.DisplayScreen();
    
                Console.ReadKey();
            }
        }

  • 相关阅读:
    linux环境下,使用Navicat连接mysql时,提示本地IP无法连接虚拟环境下的mysql解决方案
    数组-(Zero Sum Subarray)返回数组中和为某个数的子串数组
    hash、hashlib使用
    优先队列
    Jensen 不等式
    ML-集成学习:AdaBoost、Bagging、随机森林、Stacking(mlxtend)、GBDT、XGBoost、LightGBM、CatBoost原理推导及实现
    scipy.optimize优化器的各种使用
    RL-马尔科夫决策过程(MDP)-原理及实现
    ML-sklearn参数随机优化:GridSearchCV、RandomizedSearchCV、hyperopt
    5.matplotlib绘制-meshgrid区域图-可视化ML
  • 原文地址:https://www.cnblogs.com/wwj1992/p/8480884.html
Copyright © 2011-2022 走看看