设计模式——抽象工厂模式(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();
        }
    }

原文地址:https://www.cnblogs.com/wwj1992/p/8480884.html