抽象工厂模式

定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

模式概述

抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式,该模式与工厂方法模式的区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,即抽象工厂模式创建的并不是一个简单的对象,而是可以创建出多个位于不同产品等级、属于不同类型的具体产品对象。

产品等级结构和产品族

产品等级结构:表示产品的继承结构,如一个抽象类是狗,子类包括哈士奇、牧羊犬等等,抽象类与具体的子类便构成了一个产品等级结构。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的产品,位于不同产品等级结构中的一组产品。如动物中的哈士奇和海东青,哈士奇属于狗的产品等级结构中,海东青属于老鹰的产品等级结构中,哈士奇和海东青便构成了一个产品族(动物)。

抽象工厂模式的结构

image.png

  1. AbstractFactory(抽象工厂):声明了一组用于创建产品族的方法,其中每一个方法对应一个产品。
  2. Factory(具体工厂):继承自抽象工厂,实现了抽象工厂中声明的创建产品的方法。
  3. AbstractProduct(抽象产品):为每中产品声明接口,具体产品的基类。
  4. Product(具体产品):具体产品对象,实现了抽象产品中声明的业务方法。

抽象工厂模式的实现

  1. 抽象产品类
abstract class AbstractProductA
{
    public void SameMethod()
    {
        //所有产品的公共方法
        Console.WriteLine("所有产品A的公共方法");
    }

    //差异化行为
    public abstract void DiffMethod();
}

abstract class AbstractProductB
{
    public void SameMethod()
    {
        //所有产品的公共方法
        Console.WriteLine("所有产品B的公共方法");
    }

    //差异化行为
    public abstract void DiffMethod();
}
  1. 具体产品类
//产品A1
class ProductA1 : AbstractProductA
{
    public override void DiffMethod()
    {
        //这里实现产品A1的业务逻辑
        Console.WriteLine("这里实现产品A的业务逻辑");
    }
}

//产品B1
class ProductB1 : AbstractProductB
{
    public override void DiffMethod()
    {
        //这里实现产品B1的业务逻辑
        Console.WriteLine("这里实现产品B的业务逻辑");
    }
}
  1. 抽象工厂类
abstract class AbstractFactory
{
    public abstract AbstractProductA CreateProductA();
    public abstract AbstractProductB CreateProductB();
}
  1. 具体工厂类
class ConcreteFactory : AbstractFactory
{
    public override AbstractProductA CreateProductA()
    {
        return new ProductA1();
    }

    public override AbstractProductB CreateProductB()
    {
        return new ProductB1();
    }
}
  1. 使用
var factory = new ConcreteFactory();
var productA = factory.CreateProductA();
productA.SameMethod();
productA.DiffMethod();

var productB = factory.CreateProductB();
productB.SameMethod();
productB.DiffMethod();
  1. 结果
    image.png

开闭原则倾斜性

如果在使用抽象工厂模式的过程中考虑不全面,在设计的时候遗漏了产品族中的某一产品,导致后续需求变动出现新的产品时,需要修改抽象工厂类,以添加对新产品的创建接口,同时还要修改具体的工厂类,否则无法将新产品应用于系统中。

在抽象工厂模式中,增加新的产品族非常方便,但是要给已有产品族增加新的产品却很麻烦,抽象工厂模式的这种特性便是开闭原则倾斜性。

对于抽象工厂模式来说,其功能增强包括:

  1. 增加产品族:对此,抽象工厂模式可以很好的支持,并满足开闭原则,只需增加具体产品族对应增加一个新的工厂即可。
  2. 现有产品族中增加新的产品:需要修改所有的工厂角色,以增加创建新产品的方法,违背了开闭原则。

抽象工厂模式以一种倾斜的方式满足开闭原则,因此在使用时要慎重考虑,避免出现在设计完之后增加或删除产品族中的产品,会导致系统出现较大的改动。

抽象工厂模式的优点

  1. 当一个产品族中的多个对象被设计成一起工作时,可以保证使用的是同一产品族的对象。
  2. 增加新的产品族很方便,符合开闭原则。

抽象工厂模式的缺点

增加新的产品等级结构很麻烦,违背开闭原则。

什么时候考虑使用抽象工厂模式?

  1. 系统中存在一个以上的产品族,但每次只使用其中某一族的产品进行工作。
  2. 产品等级结构稳定,设计完成后不会添加新的产品等级结构或者删除已有的产品等级结构。
7 声望
3 粉丝
0 条评论
推荐阅读
装饰模式
装饰模式可以在不改变已有对象本身的功能的基础上给对象增加额外的新职责,好比日常生活中的照片,可以给照片使用相框,使之具有防潮的功能,但是这样并没有改变照片本身,这便是装饰模式。

DoubleJ阅读 782

工作中常用的设计模式--享元模式
一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java,基于Spring框架。

lpe2344阅读 999

封面图
面试的时候别再说你不会设计模式了
最近在设计一个对某个中间件的测试方案,这个测试方案需要包含不同的测试逻辑,但相同的是需要对各个环节进行记录;比如统计耗时、调用通知 API 等相同的逻辑。

crossoverJie阅读 1.1k

设计模式那些事(4)——常见结构型模式在Go中的应用
上一篇创建型(单例/工厂/建造者)设计模式在Go中的应用介绍了一些常见的创建型设计模式,创建型主要解决了类的创建问题,使代码更易用,而我们经常遇到另外一种问题:类或对象如何组合在一起效率更高,结构型模...

爆裂Gopher1阅读 629评论 1

封面图
设计模式那些事(3)——使用建造者模式封装go的http库
{代码...} 具体实现 {代码...} 使用 {代码...}

爆裂Gopher1阅读 785

封面图
工作中常用的设计模式--适配器模式
一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java,基于Spring框架。

lpe234阅读 1k

封面图
工作中常用的设计模式--责任链模式
一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java,基于Spring框架。

lpe234阅读 932

封面图
7 声望
3 粉丝
宣传栏