设计模式 抽象工厂模式

抽象工厂模式

一.什么是抽象工厂?

传统理解:抽象工厂模式是所有形态的工厂模式最为抽象和最具一般性的一一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

个人理解:抽象工厂就是指返回多个抽象类中需要的具体子类的实例。(不管怎么做折腾目的是得到具体子类的实例。)

二.案例:

还是用皮具厂的例子把!

首先老板接到一订单,客户要求皮具厂生产皮包(钱包,旅行包,背包,电脑包),老板有两个工厂,都可以生产钱包,旅行包,背包,电脑包,于是乎,老板将订单分配给两个工厂,一个工厂生产钱包,一个工厂生产旅行包。

 接下来我们就用编程来实现吧。

二.Demo:

为了大家能动脑动手,我就写了一个产品,大家可以再增加一个产品如:旅行包,背包,电脑包等等。

 抽象工厂:增加一个产品的时候,直接在抽象工厂里增加一个抽象方法即可;

  /// <summary>
    /// 抽象工厂
    /// </summary>
    public abstract class AbstractFactory
    {
        /// <summary>
        /// 抽象方法(钱包)
        /// </summary>
        /// <returns></returns>
        public abstract AbstractProduct.AbstractProduct CreateWallet();

    }

具体工厂:当增加一个产品时,增加一个具体工厂即可;

 /// <summary>
    ///具体工厂(钱包)
    /// </summary>
    public abstract class WalletFactory : AbstractFactory_Demo.AbstractFactory.AbstractFactory
    {

        public override AbstractProduct.AbstractProduct CreateWallet()
        {
            return new Wallet();
        }
    }

抽象产品:当增加一个产品时,增加一个抽象类即可;

 /// <summary>
    /// 抽象产品(钱包)
    /// </summary>
    public abstract class AbstractProduct
    {
      public abstract void Make();
    }

具体产品:增加一个产品时,增加一个具体产品类即可;

  /// <summary>
    /// 具体产品(钱包)
    /// </summary>
    public class Wallet : AbstractProduct.AbstractProduct
    {
        /// <summary>
        ///重写抽象方法
        /// </summary>
        public override void Make()
        {
            Console.WriteLine("钱包");
        }
    }


调用:当增加了一个产品后,直接在这里可以切换;

class Program
    {
        static void Main(string[] args)
        {
            //通过反射(钱包)
            string assemblyName = "AbstractFactory_Demo";
            string fullName = assemblyName + ".Wallet";//钱包
            //string fullName = assemblyName + ".TravellingBag";//旅行包
            //------上面这些大家可以放到配置文件里,是不是特简单,这样就会达到当增加一个产品的时候,不需修改之前产品的代码,只需增加产品即可--------//

            var s = Assembly.Load(assemblyName);
            var instance = s.CreateInstance(fullName);
            AbstractFactory_Demo.AbstractProduct.AbstractProduct product = (AbstractFactory_Demo.AbstractProduct.AbstractProduct)instance;
            product.Make();

            Console.Read();
        }
    }

三.注意:

1. 具体产品抽象出一个抽象产品;

钱包---------------包

2.具体工厂抽象出一个抽象工厂;

钱包工厂----------包工厂

逻辑与思维,质的变化。

    ---------逻辑思维

原文地址:https://www.cnblogs.com/zlp520/p/6292814.html