码迷,mamicode.com
首页 > 其他好文 > 详细

4、设计模式-创建型模式-抽象工厂模式

时间:2019-05-19 14:08:45      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:父类   不同   工厂方法模式   turn   line   扩展   形状   相关   extend   

 抽象工厂模式

 

产品等级结构和产品族

工厂方法模式中具体工厂负责生产具体的产品

每一个具体工厂对应一种具体的产品

工厂方法具有唯一性

一般情况下:一个具体工厂中只有一个或一组重载的工厂方法

 

有时候希望一个一个工厂可以提供多个产品对象

而不是单一的产品对象

 

产品等级结构

产品等级结构即产品的继承结构,如一个抽象类是电视机

子类有海尔电视机、海信电视机等

抽象电视机与具体与具体品牌的电视机之间构成了一个产品等级结构

抽象电视机是父类,具体品牌的电视机是其子类

 

产品族

在抽象工厂模式中

产品族是指由同一个工厂生产的

位于不同产品等级结构中的一组产品

如海尔电器工厂生产海尔电视、海尔冰箱等

海尔电视机位于电视机产品等级结构中

海尔电冰箱位于电冰箱产品等级结构中

海尔电视机、海尔电冰箱构成了一个产品族

 

图示:

技术图片

不同颜色的多个正方形、圆形、椭圆分别构成了三个不同的产品等级结构

相同颜色的正方形、圆形、椭圆形构成了一个产品族

每一个形状对象都位于某个产品族

并属于产品等级结构

图中一共有五个产品族分别属于三个不同的等级结构

只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一确定这个产品

 

当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结
构、属于不同类型的具体产品时就可以使用抽象工厂模式。

抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式。

 

抽象工厂模式与工厂方法模式最大的区别在于,
工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一
个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。

 

当一个工厂等级结构
可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方
法模式更为简单、更有效率。

 

抽象工厂模式示意图

技术图片

每一个具体工厂可以生产属于一个产品族的所有产品,例如生产颜色相同的正方
形、圆形和椭圆形,所生产的产品又位于不同的产品等级结构中。

 

相关概述:

抽象工厂模式为创建一组对象提供了一种解决方案

与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品

他只负责创建一族产品

 

定义:

提供了一个创建一系列相关或相互依赖对象的接口

无须知道指定他们具体的类

抽象工厂模式又称为Kit模式,他是一种创建型模式

 

抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品

这些产品构成了一个产品族

图示:

技术图片

 

角色:

AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一
种产品。

abstract class AbstractFactory {
public abstract AbstractProductA createProductA(); //工厂方法一
public abstract AbstractProductB createProductB(); //工厂方法二
……
}

 

 

ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具
体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。

class ConcreteFactory1 extends AbstractFactory {
  //工厂方法一
  public AbstractProductA createProductA() {
    return new ConcreteProductA1();
  }
  //工厂方法二
  public AbstractProductB createProductB() {
    return new ConcreteProductB1();
  }
  ……
}

 

 

AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的
业务方法。

 

ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中
声明的业务方法。

 

 

 事例:

公司欲开发一套界面皮肤库,可以对Java桌面软件进行界面美化。

 技术图片

该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以
在不修改既有代码的基础上增加新的皮肤。

 

 解决方法:

 

4、设计模式-创建型模式-抽象工厂模式

标签:父类   不同   工厂方法模式   turn   line   扩展   形状   相关   extend   

原文地址:https://www.cnblogs.com/Mrchengs/p/10888962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!