首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >复习:GoF的23种设计模式之AbstractFactory模式(创建型)

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

作者头像
营琪
发布2019-12-25 16:08:54
3400
发布2019-12-25 16:08:54
举报
文章被收录于专栏:营琪的小记录营琪的小记录

AbstractFactory模式(抽象工厂)

在23种模式中,我感觉是最难的,当时还循环看了几次。you准备好!!

抽象工厂定义;提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

抽象工厂简单讲:就是一组Factory Method模式(工厂方法)的集合,要是不认识工厂方法模式,或者没回忆起工厂方法模式的你,请右转复习:GoF的23种设计模式之Factory Method模式(创建型)。在工厂方法模式中,一个具体的工厂负责生成一件具体的产品。但抽象工厂模式,却是一个工厂可以创建多个,并具有相互依赖关系的产品。

回到Factory Method模式(工厂方法)的例子

飞机大战

请问:假如你是程序员,敌方飞机怎么创建,需要明确飞机有大小颜色速度等等属性。游戏在循环打飞机中,我们怎么创建飞机对象?

我的做法是:创建多个具体工厂生产飞机,每个工厂生产不同的大小速度飞机,只需要几个工厂,就足以迭代一堆小飞机。

进入抽象工厂

前提“一个小飞机就要搭配一个大怪兽,一个大飞机就要搭配一个小怪兽”,请问:怎么创建敌方飞机、怪兽对象?

答:很明显创建这两个对象时,他们之间有依赖关系。,这里出现两个产品(飞机、怪兽),显然就不能用工厂方法模式(一个工厂方法模式仅可以创建一个产品)。那么一组工厂方法模式听起来有戏,也就是抽象工厂模式。

示例代码:

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

单纯介绍类信息

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档