目录
介绍
结构
实现
优缺点
使用场景:
抽象工厂模式VS建造者模式
前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、学校只培养计算机软件专业的学生等。 这些工厂只生产同种类产品,同种类产品称为同等级产品,也就是说:
工厂方法模式只考虑生产同产品等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如电器厂既生 产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。
本节要介绍的抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,下图所示横轴是产品等级,也就是同一类产品;纵轴是产品族,也就是同一品牌 的产品,同一品牌的产品产自同一个工厂。
抽象工厂模式可以帮助客户端代码更容易地创建一组相关或相互依赖的对象,并且可以提高代码的灵活性和可扩展性。它的缺点是添加新类型的产品时比较麻烦,需要同时修改抽象工厂和所有具体工厂的代码。
抽象工厂模式的主要角色如下:
抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创 建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。
现咖啡店业务发生改变,不仅要生产咖啡还要生产甜点,如提拉米苏、抹茶慕斯等,
要是按照工厂方法模式,需要定义提拉米苏类、抹茶慕斯类、提拉米苏工厂、抹茶慕斯工厂、甜点工厂类,很容易发生类 爆炸情况。
其中拿铁咖啡、美式咖啡是一个产品等级,都是咖啡;提拉米苏、抹茶慕斯也是一个产品等 级;
拿铁咖啡和提拉米苏是同一产品族(也就是都属于意大利风味),美式咖啡和抹茶慕斯是同一产品 族(也就是都属于美式风味)。所以这个案例可以使用抽象工厂模式实现。
甜品抽象类:
public abstract class Dessert {
public abstract void show();
}
抹茶慕斯类:
public class MatchaMousse extends Dessert {
public void show() {
System.out.println("抹茶慕斯");
}
}
提拉米苏类:
public class Trimisu extends Dessert {
public void show() {
System.out.println("提拉米苏");
}
}
咖啡类:
public abstract class Coffee {
public abstract String getName();
//加糖
public void addsugar() {
System.out.println("加糖");
}
//加奶
public void addMilk() {
System.out.println("加奶");
}
}
美式咖啡:
public class AmericanCoffee extends Coffee {
public String getName() {
return "美式咖啡";
}
}
拿铁咖啡:
public class LatteCoffee extends Coffee {
public String getName() {
return "拿铁咖啡";
}
}
抽象工厂:
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();
}
}
如果要加同一个产品族的话,只需要再加一个对应的工厂类即可,不需要修改其他的类。
优点:
缺点:
抽象工厂模式通常使用在以下场景中:
当需要创建一组相关或相互依赖的对象时,可以考虑使用抽象工厂模式。例如,需要创建一个操作系统,其中包括GUI、文件系统、网络协议等组件,这些组件都有多种实现方式。
当需要为不同的平台或操作系统提供不同的实现时,可以使用抽象工厂模式。例如,需要为Windows,Mac OS和Linux等操作系统提供不同的GUI实现。
当需要遵循某种标准或接口来创建对象时,可以使用抽象工厂模式。例如,需要按照某种音频或视频编解码标准来创建对象,这些对象通常具有依赖关系,需要使用抽象工厂模式来创建。
当需要通过修改配置文件或代码来切换产品族时,可以使用抽象工厂模式。例如,需要根据用户的选项来使用不同的数据库产品族(如MySQL和Oracle等),可以通过修改配置文件或代码来切换产品族,而不需要修改客户端代码。
总之,抽象工厂模式适用于需要创建一组相关或相互依赖的对象,并且这些对象需要按照某种标准或接口来创建的场景
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。
建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组 装工厂,通过对部件的组装可以返回一辆完整的汽车。
抽象工厂模式是用于创建一组相关或依赖对象的方式,而建造者模式则是用于将复杂对象的构造与其表示分离开来。两种模式都可以提高系统的灵活性和可维护性,但是它们的应用场景略有不同,需要根据具体的需求来选择使用哪种模式。