Java23种设计模式
定义:工厂方法模式的进阶,当一个工厂内包含多个小工厂的时候,负责接口分配问题。
直接看例子:
现在有一个需求造果篮,果篮分两部分组成:水果和篮子,需要建造工厂并打印出水果属性、吃法、果篮材质。
1.创造水果接口,提供方法tellMe,告知用户水果名称以及吃法。
interface Fruit{
void tellMe();
}
2.创建水果实现类:香蕉和苹果
static class Apple implements Fruit{
@Override
public void tellMe() {
System.out.print("水果名为苹果\n");
System.out.print("吃法为:削皮吃\n");
}
}
static class Banana implements Fruit{
@Override
public void tellMe() {
System.out.print("水果名为香蕉\n");
System.out.print("吃法为:剥皮吃\n");
}
}
3.创造篮子接口,对外提供方法showBasket,告知篮子材质:
interface FruitBasket{
void showBasket();
}
4.创造篮子实现类:塑料篮子、竹篮子
static class Plastic_Basket implements FruitBasket{
@Override
public void showBasket() {
System.out.print("用塑料篮子装\n");
}
}
static class Bamboo_Basket implements FruitBasket{
@Override
public void showBasket() {
System.out.print("用竹篮子装\n");
}
}
5.创造果篮接口,对外提供两个方法:获取Fruit以及获取FruitBasket:
interface Fruit_Box{
Fruit getFruit();
FruitBasket getFruitBasket();
}
- 创建果篮实现类Fruit_Box_Factory,果篮为 苹果+竹篮:
static class Fruit_Box_Factory implements Fruit_Box{
@Override
public Fruit getFruit() {
return new Apple();
}
@Override
public FruitBasket getFruitBasket() {
return new Bamboo_Basket();
}
}
- 创建工厂,完成需求:
public static void main(String[] args) {
Fruit_Box box = new Fruit_Box_Factory();
Fruit fruit = box.getFruit();
FruitBasket basket = box.getFruitBasket();
fruit.tellMe();
basket.showBasket();
}
打印:
水果名为苹果
吃法为:削皮吃
用竹篮子装
这里我们创造了Fruit_Box_Factory,调用者无须考虑内部到底使用了哪个水果(直接调用Fruit)无需考虑使用何种果篮(直接调用FruitBasket)达到解耦的目的。
与工厂方法模式的区别:
- 工厂方法模式一个工厂只包含一种产品(苹果),而抽象工厂模式生产的产品内部还包含多种产品(果篮=水果+篮子)。
- 工厂方法模式主要功能是创造一种产品(直接调用水果的接口),而抽象工厂模式主要功能是对一个产品族进行任务分发(通过抽象工厂的分配,分别调用水果的接口和篮子的接口)