系列传送门
创建型模式
这一类模式用于创建对象。
隐藏或抽象创建对象的细节,而不是使用 new直接创建对象。
设计模式一、创建型模式-单例模式
设计模式二、创建型模式-简单工厂模式
设计模式三、创建型模式-工厂模式
设计模式四、创建型模式-抽象工厂模式
设计模式五、创建型模式-建造者模式
抽象工厂模式
核心: 把对象的可变特征抽取出来作为一组接口,可以通过简单的切换这组接口的不同实现来创建不同的对象。
我饿了,下面我要生产面包🍞了。
但我有个条件,我想吃指定形状和指定口味的面包。
把面包的形状抽取出来作为一个接口
interface BreadShape {
// 将要生产的面包的形状
String getShape();
}
把面包的味道抽取出来作为一个接口
interface BreadTaste {
// 将要生产的面包的味道
String getTaste();
}
我还需要一个面包工厂,用来生产面包
定义一个面包工厂🏭的接口,该接口可获得将要生产的面包的形状和味道
public interface BreadFactory {
// 获得要生产的面包的形状
BreadShape getBreadShape();
// 获得要生产的面包的味道
BreadTaste getBreadTaste();
}
工厂有了,就差面包了😋
定义面包对象,并配置一个面包工厂来生产面包
public class Bread {
// 形状
private String shape;
// 味道
private String taste;
/**
* 使用自定义的面包工厂来生产面包
*
* @param factory 生产面包的工厂
*/
public void create(BreadFactory factory) {
// 获得要生产的面包的形状
BreadShape breadShape = factory.getBreadShape();
shape = breadShape.getShape();
// 获得要生产的面包的味道
BreadTaste breadTaste = factory.getBreadTaste();
taste = breadTaste.getTaste();
}
@Override
public String toString() {
return "形状:" + shape + " 味道:" + taste;
}
}
测试
/**
* 抽象工厂模式:
* 把对象的可变特征抽取出来作为一组接口,可以通过切换这组接口的不同实现来创建不同的对象
*/
public class Main {
public static void main(String[] args) {
// 定义一个面包
Bread bread = new Bread();
// 使用指定的面包工厂来生产指定的形状和味道的面包,需要实现这个工厂里生产面包的方法
// 这里会生产一个方形巧克力味的面包
bread.create(new BreadFactory() {
@Override
public BreadShape getBreadShape() {
return new BreadShape() {
@Override
public String getShape() {
return "方形";
}
};
}
@Override
public BreadTaste getBreadTaste() {
return new BreadTaste() {
@Override
public String getTaste() {
return "巧克力味";
}
};
}
});
System.out.println("生产了一个面包 - " + bread.toString());
// 我不想吃方形巧克力味的面包,我想换一个圆形烤鸡味的面包
// 这里直接更换面包的生产工厂即可
bread.create(new BreadFactory() {
@Override
public BreadShape getBreadShape() {
return new BreadShape() {
@Override
public String getShape() {
return "圆形";
}
};
}
@Override
public BreadTaste getBreadTaste() {
return new BreadTaste() {
@Override
public String getTaste() {
return "烤鸡味";
}
};
}
});
System.out.println("生产了一个面包 - " + bread.toString());
}
}