设计模式- 抽象工厂(Abstract Factory)

2019-05-09 15:47:22 浏览数 (1)

定义

抽象工厂(Abstract Factory)模式:为创建一组相关或相互依赖对象提供了一个接口,而且无需指定它们的具体类

抽象工厂可以向客户提供一个接口,是客户可以在不必指定产品具体类型的情况下,创建多个产品家族中的产品对象,它强调的系列对象的变化。

C#例子

代码语言:javascript复制
    public abstract class Product
    {
        public abstract string GetName(ProductType productType);
    }
    public abstract class ProductType
    {
        public abstract string GetProductType();
    }

    public class ProductA : Product
    {
        public override string GetName(ProductType productType)
        {
            return "我是A产品,型号是" productType.GetProductType();
        }
    }
    public class ProductB : Product
    {
        public override string GetName(ProductType productType)
        {
            return "我是B产品,型号是" productType.GetProductType();
        }
    }
    public class ProductType1 : ProductType
    {
        public override string GetProductType()
        {
            return "1";
        }
    }
    public class ProductType2 : ProductType
    {
        public override string GetProductType()
        {
            return "2";
        }
    }

public abstract class Factory
    {
        public abstract Product CreateProduct();

        public abstract ProductType CreateProductType();
    }

    public class FactoryA1 : Factory
    {
        public override Product CreateProduct()
        {
            return new ProductA();
        }

        public override ProductType CreateProductType()
        {
            return new ProductType1();
        }
    }
    public class FactoryB2 : Factory
    {
        public override Product CreateProduct()
        {
            return new ProductB();
        }

        public override ProductType CreateProductType()
        {
            return new ProductType2();
        }
    }
    public class Client
    {
        private Product _product;
        private ProductType _productType;

        public Client(Factory factory)
        {
            _product = factory.CreateProduct();
            _productType = factory.CreateProductType();
        }

        public void Run()
        {
            Console.WriteLine(_product.GetName(_productType));
        }
    }
        static void Main(string[] args)
        {
            var client1 = new Client(new FactoryA1());
            client1.Run();
            var client2 = new Client(new FactoryB2());
            client2.Run();
            Console.ReadLine();
        }

抽象工厂模式参与者:

  • Factory:声明一个创建抽象产品对象的操作接口
  • Factory*:实现创建具体产品对象的操作
  • Product:声明一类产品产品对象接口
  • Product*: 定义一个被相应具体工厂创建的产品对象 ,实现Product接口
  • ProductType:声明与Product有关联的对象接口
  • ProductType*:定义一个被相应具体工厂创建的产品对象 ,实现ProductType接口
  • Client:使用Factory和Product类声明的接口

抽象工厂模式适用情形

  • 同一个产品族的Product在一起使用时,而且它们之间是相互依赖的,不可分离
  • 系统需要由相互关联的多个对象来构成
  • 当想提供一组对象而不显示它们的实现过程,只显示它们的接口
  • 系统不应当依赖一些具体Product类

抽象工厂模式的特点

  • 隔离了具体类的生成,客户不需要知道怎样生成每一个具体Product,什么时间生成的。它将客户与具体的类分离,依赖于抽象类,耦合性低。
  • 一个产品族中的多个对象设计成一起工作,它能保证客户端始终只使用一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说是非常实用的一种设计模式。
  • 有利于更换产品系列,由于客户端只依赖于抽象类,更换产品系列时,只需要更改一下具体工厂名就可以。
  • 难以支持新种类的产品,这是因为抽象工厂接口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将引起抽象工厂类及其所有子类的改变。

其他

抽象工厂模式与工厂方法模式区别(产品个数)

  • 工厂方法模式只有一个抽象产品类,而抽象工厂模式可以有多个抽象产品类
  • 工厂方法模式针对一个产品等级结构,可以派生出多个具体产品类;抽象工厂模式针对面向多个产品等级结构,每个抽象产品类可以派生出多个具体产品类。

源码地址

dotnet-design-patterns

其他设计模式

23种设计模式

0 人点赞