zoukankan      html  css  js  c++  java
  • 设计模式 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关的或相互依赖的接口,而无需指定他们具体的类。抽象工厂模式又称为kit模式。

     模式动机:

        在工厂方法模式中,每一个具体的工厂只对应一种具体的产品,工厂方法具有唯一性,简单来说就是每一个工厂只能生产一种产品(工厂方法模式),如果我们想要一个工厂生产多个产品那么我们就需要用到抽象工厂模式

     在介绍抽象工厂的具体流程之前首先需要引入两个概念产品等级结构产品族

    • 产品等级结构

        产品等级结构即产品的继承结构,也就是说有一个抽象类是电视机的话,他的子类有海尔电视机、海信电视机、TCL电视机等那么这个抽象电视机和具体电视机就构成一个产品等级结构。

    • 产品族:

        在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同的产品登记结构中的一组产品。如海尔工厂可以生产海尔电视机、海尔冰箱、海尔空调,这些海尔工厂生产的东西构成一个产品族。

     抽象工厂模式包括下面四种角色:

    • AbstractFactory:抽象工厂
    • ConcreteFactory:具体工厂
    • AbstractProtect:抽象产品
    • Project:具体产品

      具体流程如下图所示:具体的产品工厂继承自抽象的产品工厂,具体的产品继承自抽象的产品,具体的产品工厂引用具体的产品引用关系为制造关系。客户端知晓具体的工厂名称,客户端持具体方法名称向抽象工厂发送请求获取到一个具体工厂的对象,具体工厂对象可以实现该工厂的产品族中所有产品的制造方法。

    抽象工厂模式优点

    •   保证客户端只是用同一个产品族中的对象工作
    • 增加新的具体工厂和产品族很方便,无需修改已有系统,符合开闭原则

    缺点:

    • 难以扩展抽象工厂来生产新种类的产品,如果有建立新的产品等级结构那么需要修改所有抽象工厂的子类去拥有这个方法
    • 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)

    工厂模式之间的关联:

    将简单工厂模式的工厂方法变成一个抽象工厂,其内部实现分别由继承他的具体工厂实现,简单工厂模式就变成工厂方法模式,在工厂方法模式中将工厂生产的产品由一个变成多个,工厂方法模式就变成了抽象工厂模式。

  • 相关阅读:
    [极客大挑战 2019]BuyFlag
    [极客大挑战 2019]BabySQL
    [网鼎杯 2018]Fakebook
    C语言学习笔记_内存数据和字符串
    剑指OFFER_数据流中的中位数
    剑指OFFER_滑动窗口的最大值
    剑指OFFER_矩阵中的路径
    C语言学习笔记_指针相关知识
    剑指OFFER_机器人的运动范围
    剑指OFFER_剪绳子
  • 原文地址:https://www.cnblogs.com/wfswf/p/15615326.html
Copyright © 2011-2022 走看看