抽象工厂模式
抽象工厂模式是一种创建型设计模式,旨在提供一个接口来创建一系列相关或依赖对象,而无需指定其具体类。
同级别产品指同一类型产品,,同产品族是指一组相关的对象或产品,类似同一品牌。
抽象工厂模式是工厂方法模式的升级版,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
抽象工厂模式结构:
抽象工厂(Abstract Factory):声明创建不同产品的方法(如 createButton(), createTextbox())。
具体工厂(Concrete Factory):实现抽象工厂接口,生成具体产品(如 WindowsFactory 创建 Windows 风格组件)。
抽象产品(Abstract Product):定义产品接口(如 Button, Textbox)。
具体产品(Concrete Product):实现抽象产品接口(如 WindowsButton, MacTextbox)。
具体案例:
咖啡店拓展原有业务,不仅生产咖啡,还需要生产甜点(如提拉米苏,抹茶慕斯等)。这种情况下,拿铁咖啡和美式咖啡是同一产品等级,都是咖啡这一种类。而拿铁咖啡和提拉米苏是同一产品族,都属于意大利风味。
具体实例如下:
//咖啡
public abstract class Coffee {
//咖啡名
public abstract String getName();
//加糖
public void addSuger(){
System.out.println("Add Suger");
}
//加牛奶
public void addMilk(){
System.out.println("Add Milk");
}
}
public class AmericanCoffee extends Coffee {
@Override
public String getName() {
return "美式咖啡";
}
}
public class LatteCoffee extends Coffee {
@Override
public String getName() {
return "拿铁咖啡";
}
}
//甜品
public abstract class Dessert {
public abstract void show();
}
//提拉米苏甜点
public class Trimisu extends Dessert{
@Override
public void show() {
System.out.println("提拉米苏");
}
}
//抹茶甜点
public class MatchaMousse extends Dessert{
@Override
public void show() {
System.out.println("抹茶");
}
}
//工厂接口
public interface DessertFactory {
//生产咖啡
Coffee createCoffee();
//生产甜点
Dessert createDessert();
}
//意大利风味甜品工厂,拿铁和提拉米苏
public class ItalyDesserFactory implements DessertFactory{
@Override
public Coffee createCoffee() {
return new LatteCoffee();
}
@Override
public Dessert createDessert() {
return new Trimisu();
}
}
//美式风味,美式咖啡和抹茶甜品
public class AmericanDessertFactory implements DessertFactory {
@Override
public Coffee createCoffee() {
return new AmericanCoffee();
}
@Override
public Dessert createDessert() {
return new MatchaMousse();
}
}
//测试类
public class Client {
public static void main(String[] args) {
//创建的是意大利风味甜品工厂对象
//ItalyDesserFactory factory=new ItalyDesserFactory();
AmericanDessertFactory factory = new AmericanDessertFactory();
//获取拿铁咖啡和提拉米苏甜品
Coffee coffee = factory.createCoffee();//意大利
Dessert dessert = factory.createDessert();//意大利
System.out.println(coffee.getName());
dessert.show();
}
}
如果接下来需要添加同一个产品族,只需要再加一个对应工厂即可不需要修改其他的类。
优点:当一个产品族中的多个对象被设计成一起工作时,他能保证客户端始终只使用同一个产品族中的对象。
缺点:当产品族中需要增加一个新产品时,所有工厂类都需要进行修改