复习:GoF的23种设计模式之AbstractFactory模式(创建型)

2019-12-25 16:08:54 浏览数 (1)

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类图

单纯介绍类信息

抽象工厂:返回两个相互依赖的不同产品

0 人点赞