最牛网站建设,wordpress做网站教程,哈尔滨网站托管,网页制作基础教程笔记抽象工厂模式
前面介绍的工厂方法模式中考虑的是一类产品的生产#xff0c;如畜牧场只养动物、电视机厂只生产电视机、传智播客只培养计算机软件专业的学生等。
这些工厂只生产同种类产品#xff0c;同种类产品称为同等级产品#xff0c;也就是说#xff1a;工厂方法模式…抽象工厂模式
前面介绍的工厂方法模式中考虑的是一类产品的生产如畜牧场只养动物、电视机厂只生产电视机、传智播客只培养计算机软件专业的学生等。
这些工厂只生产同种类产品同种类产品称为同等级产品也就是说工厂方法模式只考虑生产同等级的产品但是在现实生活中许多工厂是综合型的工厂能生产多等级种类 的产品如电器厂既生产电视机又生产洗衣机或空调大学既有软件专业又有生物专业等。
本节要介绍的抽象工厂模式将考虑多等级产品的生产将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族下图所示横轴是产品等级也就是同一类产品纵轴是产品族也就是同一品牌的产品同一品牌的产品产自同一个工厂。 概念
是一种为访问类提供一个创建一组相关或相互依赖对象的接口且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本工厂方法模式只生产一个等级的产品而抽象工厂模式可生产多个等级的产品。
结构
抽象工厂模式的主要角色如下 抽象工厂Abstract Factory提供了创建产品的接口它包含多个创建产品的方法可以创建多个不同等级的产品。 具体工厂Concrete Factory主要是实现抽象工厂中的多个抽象方法完成具体产品的创建。 抽象产品Product定义了产品的规范描述了产品的主要特性和功能抽象工厂模式有多个抽象产品。 具体产品ConcreteProduct实现了抽象产品角色所定义的接口由具体工厂来创建它 同具体工厂之间是多对一的关系。
实现
现咖啡店业务发生改变不仅要生产咖啡还要生产甜点如提拉米苏、抹茶慕斯等要是按照工厂方法模式需要定义提拉米苏类、抹茶慕斯类、提拉米苏工厂、抹茶慕斯工厂、甜点工厂类很容易发生类爆炸情况。其中拿铁咖啡、美式咖啡是一个产品等级都是咖啡提拉米苏、抹茶慕斯也是一个产品等级拿铁咖啡和提拉米苏是同一产品族也就是都属于意大利风味美式咖啡和抹茶慕斯是同一产品族也就是都属于美式风味。所以这个案例可以使用抽象工厂模式实现。类图如下 代码如下
抽象工厂 public interface DessertFactory {
Coffee createCoffee();
Dessert createDessert();
}具体工厂//美式甜点工厂
public class AmericanDessertFactory implements DessertFactory {
public Coffee createCoffee() { return new AmericanCoffee(); }
public Dessert createDessert() { return new MatchaMousse(); }
}
//意大利风味甜点工厂
public class ItalyDessertFactory implements DessertFactory {
public Coffee createCoffee() { return new LatteCoffee(); }
public Dessert createDessert() { return new Tiramisu(); }
}如果要加同一个产品族的话只需要再加一个对应的工厂类即可不需要修改其他的类。
优缺点
优点
当一个产品族中的多个对象被设计成一起工作时它能保证客户端始终只使用同一个产品族中的对象。
缺点
当产品族中需要增加一个新的产品时所有的工厂类都需要进行修改。
使用场景 当需要创建的对象是一系列相互关联或相互依赖的产品族时如电器工厂中的电视机、洗衣机、空调等。 系统中有多个产品族但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。 系统中提供了产品的类库且所有产品的接口相同客户端不依赖产品实例的创建细节和内部结构。
如输入法换皮肤一整套一起换。生成不同操作系统的程序。