设计模式 | 抽象工厂

栏目: 后端 · 发布时间: 3个月前

来源: chenmingyu.top

本文转载自:https://chenmingyu.top/design-abstract-factory/,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

抽象工厂比工厂模式更为抽象,工厂模式只生产一种产品族,而抽象工厂生产多个产品族

产品族是指同一工厂生产的一组不同产品结构的一组产品,比如射击游戏工厂生产单人射击游戏和双人射击游戏两款产品,这里的单人射击游戏产和双人射击游戏两款产品统称为产品族

以上面的游戏为例,现在有射击游戏和塔防游戏俩款游戏,现在需求变了,要求射击类游戏又细分为单人和双人两款游戏产品,塔防类游戏细分为单人和双人两款游戏产品。这时射击类游戏和塔防类游戏就是两个产品族,旗下分别有两款产品一款是单人游戏,一款是双人游戏

类图

有点复杂,画个类图,看着清晰一些

设计模式 | 抽象工厂

  1. GameFactory:抽象工厂,规定了生成单人和双人两种游戏
  2. ShootGameFactory,ShootGameFactory:具体工厂,负责生产具体的射击类和塔防类单,双人游戏
  3. Gameable是抽象产品,ShootGame和TowerDefenceGame是抽象类,继承Gameable
  4. SingleShootGame,DoubleShootGame,SingleTowerDefenceGame,DoubleTowerDefenceGame是具体产品

GameFactory

抽象工厂,规定了生成单人和双人两种游戏

/**
 * @auther: chenmingyu
 * @date: 2019/2/14 11:29
 * @description: 抽象工厂
 */
public interface GameFactory {

    /**
     * 生产单人游戏
     * @return
     */
    Gameable createSingleGame();

    /**
     * 生产双人游戏
     * @return
     */
    Gameable createDoubleGame();

}

ShootGameFactory

具体工厂,负责生产具体的射击类单人游戏和射击类双人游戏

/**
 * @auther: chenmingyu
 * @date: 2019/2/14 18:20
 * @description: 设计游戏制造厂
 */
public class ShootGameFactory implements GameFactory{

    @Override
    public Gameable createSingleGame() {
        return new SingleShootGame();
    }

    @Override
    public Gameable createDoubleGame() {
        return new DoubleShootGame();
    }
}

TowerDefenceGameFactory

具体工厂,负责生产具体的塔防类单人游戏和塔防类双人游戏

/**
 * @auther: chenmingyu
 * @date: 2019/2/14 18:20
 * @description: 塔防游戏制造厂
 */
public class TowerDefenceGameFactory implements GameFactory {

    @Override
    public Gameable createSingleGame() {
        return new SingleTowerDefenceGame();
    }

    @Override
    public Gameable createDoubleGame() {
        return new DoubleTowerDefenceGame();
    }
}

Gameable

抽象产品,所有游戏产品均实现该接口

/**
 * @auther: chenmingyu
 * @date: 2019/2/14 11:19
 * @description: 游戏接口
 */
public interface Gameable {

    /**
     * 校验账户信息
     * @param nickName
     */
    void validateAccount(String nickName);


    /**
     * 游戏人数
     */
    void getPlayerNumber();
}

ShootGame和TowerDefenceGame

抽象类,实现Gameable接口

/**
 * @auther: chenmingyu
 * @date: 2019/2/14 11:26
 * @description: 射击类游戏
 */
public abstract class ShootGame implements Gameable{

    @Override
    public void validateAccount(String nickName) {
        System.out.println("射击游戏校验昵称:"+nickName);
    }

}
/**
 * @auther: chenmingyu
 * @date: 2019/2/14 11:28
 * @description: 塔防类游戏
 */
public abstract class TowerDefenceGame implements Gameable{

    @Override
    public void validateAccount(String nickName) {
        System.out.println("塔防游戏校验昵称:"+nickName);
    }

}

具体产品

共四款游戏产品:SingleShootGame,DoubleShootGame,SingleTowerDefenceGame,DoubleTowerDefenceGame

/**
 * @auther: chenmingyu
 * @date: 2019/2/15 16:55
 * @description: 单人射击游戏
 */
public class SingleShootGame extends ShootGame {

    @Override
    public void getPlayerNumber() {
        System.out.println("这是一个单人玩的射击游戏");
    }
}
/**
 * @auther: chenmingyu
 * @date: 2019/2/15 16:57
 * @description: 双人射击游戏
 */
public class DoubleShootGame extends ShootGame{

    @Override
    public void getPlayerNumber() {
        System.out.println("这是一个双人玩的射击游戏");
    }
}
/**
 * @auther: chenmingyu
 * @date: 2019/2/15 17:17
 * @description: 单人塔防游戏
 */
public class SingleTowerDefenceGame extends TowerDefenceGame{

    @Override
    public void getPlayerNumber() {
        System.out.println("这是一个单人玩的塔防游戏");
    }
}
/**
 * @auther: chenmingyu
 * @date: 2019/2/15 17:18
 * @description: 双人塔防游戏
 */
public class DoubleTowerDefenceGame extends TowerDefenceGame{
    @Override
    public void getPlayerNumber() {
        System.out.println("这是一个双人玩的塔防游戏");
    }
}

测试

public static void main(String[] args) throws Exception{

    ShootGameFactory shootGameFactory = new ShootGameFactory();
    shootGameFactory.createSingleGame().getPlayerNumber();
    shootGameFactory.createDoubleGame().getPlayerNumber();

    TowerDefenceGameFactory towerDefenceGameFactory = new TowerDefenceGameFactory();
    towerDefenceGameFactory.createSingleGame().getPlayerNumber();
    towerDefenceGameFactory.createDoubleGame().getPlayerNumber();
}

输出

这是一个单人玩的射击游戏
这是一个双人玩的射击游戏
这是一个单人玩的塔防游戏
这是一个双人玩的塔防游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

为你推荐:

相关软件推荐:

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计模式

设计模式

[美] Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides / 李英军、马晓星、蔡敏、刘建中 等 / 机械工业出版社 / 2000-9 / 35.00元

这本书结合设计实作例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。书中分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别有用。此书适合大学计算机专业的学生、研究生及相关人员参考。 书中涉及的设计模式并不描述新的或未经证实的设计,只收录了那些在不同系统中多次使用过的成功设计。一起来看看 《设计模式》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试