概述: 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。优点:
隔离了具体类的生成,使得客户端不需要知道什么被创建 当一个产品族的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族的对象 抽象工厂模式增加新的产品族很容易,无需修改已有系统,符合开闭原则缺点:
增加新的产品结构很麻烦,需要对原有系统进行大规模的修改,甚至需要修改抽象层代码,违背了开闭原则抽象工厂模式的适用环境:
当一个系统不依赖于产品类实例如何被创建、组合和表达的细节,用户无需关心对象的创建过程,将对象的创建和适用解耦。 系统中有多于一个的产品族,但每次只需要使用其中某一个产品族,可以通过配置文件等动态地改变产品族,也很方便的增加新的产品族。 属于同一个产品族的产品将一起使用。 产品等级结构稳定,设计完成后,不会向系统增加新的产品等级结构或者删除已有的产品等级结构。实例
现咖啡店业务发生改变,不仅要生产咖啡还要生产甜点,如提拉米苏、抹茶慕斯等,要是按照工厂方法模式,需要定义提拉米苏类、抹茶慕斯类、提拉米苏工厂、抹茶慕斯工厂、甜点工厂类,很容易发生类爆炸情况。其中拿铁咖啡、美式咖啡是一个产品等级,都是咖啡;提拉米苏、抹茶慕斯也是一个产品等级;拿铁咖啡和提拉米苏是同一产品族(也就是都属于意大利风味),美式咖啡和抹茶慕斯是同一产品族(也就是都属于美式风味)。
类图
咖啡抽象类
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 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 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 Trimisu();
}
}
测试类
public class Client {
public static void main(String[] args) {
//创建意大利风味的产品
DessertFactory factory = new ItalyDessertFactory();
//咖啡
Coffee coffee = factory.createCoffee();
//甜品
Dessert dessert = factory.createDessert();
//显示
System.out.println(coffee.getName());
dessert.show();
}
}
测试结果
解释说明
假如需要加上中国风味的产品族,产品族有牛奶咖啡和年糕,可以创建一个实现咖啡抽象类的牛奶咖啡类; 年糕属于甜点可创建一个实现原来甜点抽象类的年糕类,然后创建一个中国风味的工厂类,实现原来的产品族抽象工厂(接口); 测试创建中国风味的牛奶咖啡产品和年糕产品即可。也是不用修改原来的对象,符合开闭原则。 抽象工厂对比与工厂方法是可以生产多个不同产品。
注:当新增一个产品时,会改变所有的工厂代码。如新增茶的产品时,抽象工厂会新增一个创建茶的方法,原来实现这个抽象工厂的美式风味工厂和意大利风味工厂也要添加创建茶的方法。就违反了开闭原则。所以抽象工厂是针对产品族时才可以。
结束!!!!
不要再抱怨,没有任何意义。



