AbstractFactory模式(抽象工厂)
在23种模式中,我感觉是最难的,当时还循环看了几次。you准备好!!
抽象工厂定义;提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
抽象工厂简单讲:就是一组Factory Method模式(工厂方法)的集合,要是不认识工厂方法模式,或者没回忆起工厂方法模式的你,请右转复习:GoF的23种设计模式之Factory Method模式(创建型)。在工厂方法模式中,一个具体的工厂负责生成一件具体的产品。但抽象工厂模式,却是一个工厂可以创建多个,并具有相互依赖关系的产品。
回到Factory Method模式(工厂方法)的例子
飞机大战
请问:假如你是程序员,敌方飞机怎么创建,需要明确飞机有大小颜色速度等等属性。游戏在循环打飞机中,我们怎么创建飞机对象?
我的做法是:创建多个具体工厂生产飞机,每个工厂生产不同的大小速度飞机,只需要几个工厂,就足以迭代一堆小飞机。
进入抽象工厂
前提“一个小飞机就要搭配一个大怪兽,一个大飞机就要搭配一个小怪兽”,请问:怎么创建敌方飞机、怪兽对象?
答:很明显创建这两个对象时,他们之间有依赖关系。,这里出现两个产品(飞机、怪兽),显然就不能用工厂方法模式(一个工厂方法模式仅可以创建一个产品)。那么一组工厂方法模式听起来有戏,也就是抽象工厂模式。
示例代码:
代码语言:javascript复制public class AbstractFactoryTest {
public static void main(String[] args) {
AbstractFactory factory1 = new OneFactory("空客飞机", "空客怪兽");
System.out.println(factory1.getMonsterProduct().look());
System.out.println(factory1.getPlaneProduct().use());
AbstractFactory factory2 = new TwoFactory("中空飞机", "中空怪兽");
System.out.println(factory2.getMonsterProduct().look());
System.out.println(factory2.getPlaneProduct().use());
}
}
abstract class AbstractFactory{ //抽象工厂
public abstract AbstractPlaneProduct getPlaneProduct();
public abstract AbstractMonsterProduct getMonsterProduct();
}
abstract class AbstractPlaneProduct{ //抽象产品:飞机
public abstract String use();
}
abstract class AbstractMonsterProduct{ //抽象产品:怪兽
public abstract String look();
}
class BigPlan extends AbstractPlaneProduct{ //具体产品:大飞机
private String str;
public BigPlan(String name) {
this.str = name "大飞机,并且有一些特别属性";
}
@Override
public String use() {
return str;
}
}
class SmallPlan extends AbstractPlaneProduct{ //具体产品:小飞机
private String str;
public SmallPlan(String name) {
this.str = name "小飞机,来打打酱油,当时我的小伙伴时大怪兽";
}
@Override
public String use() {
return str;
}
}
class SmallMonster extends AbstractMonsterProduct{ //具体产品:小怪兽
private String str;
public SmallMonster(String name) {
this.str = name "小怪兽,也很牛逼的。我的大伙伴呢";
}
@Override
public String look() {
return "look():" str;
}
}
class BigMonster extends AbstractMonsterProduct{ //具体产品:大怪兽
private String str;
public BigMonster(String name) {
this.str = name "大怪兽,一刀伤害9999";
}
@Override
public String look() {
return "look():" str;
}
}
class OneFactory extends AbstractFactory{ //第一个具体工厂
private String planeName;
private String monsterName;
public OneFactory(String planeName,String monsterName) {
this.monsterName = "OneFactory:" monsterName;
this.planeName = "OneFactory:" planeName;
}
@Override
public AbstractPlaneProduct getPlaneProduct() {
return new BigPlan(planeName);
}
@Override
public AbstractMonsterProduct getMonsterProduct() {
return new SmallMonster(monsterName);
}
}
class TwoFactory extends AbstractFactory{ //第二个具体工厂
private String planeName;
private String monsterName;
public TwoFactory(String planeName,String monsterName) {
this.monsterName = "TwoFactory:" monsterName;
this.planeName = "TwoFactory:" planeName;
}
@Override
public AbstractPlaneProduct getPlaneProduct() {
return new SmallPlan(planeName);
}
@Override
public AbstractMonsterProduct getMonsterProduct() {
return new BigMonster(monsterName);
}
}
UML类图
单纯介绍类信息
抽象工厂:返回两个相互依赖的不同产品