设计模式 | 抽象工厂

栏目: 后端 · 发布时间: 6年前

内容简介:抽象工厂比工厂模式更为抽象,工厂模式只生产一种产品族,而抽象工厂生产多个产品族产品族是指同一工厂生产的一组不同产品结构的一组产品,比如射击游戏工厂生产单人射击游戏和双人射击游戏两款产品,这里的单人射击游戏产和双人射击游戏两款产品统称为产品族以上面的游戏为例,现在有射击游戏和塔防游戏俩款游戏,现在需求变了,要求射击类游戏又细分为单人和双人两款游戏产品,塔防类游戏细分为单人和双人两款游戏产品。这时射击类游戏和塔防类游戏就是两个产品族,旗下分别有两款产品一款是单人游戏,一款是双人游戏

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

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

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

类图

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

设计模式 | 抽象工厂

  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();
}

输出

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

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

查看所有标签

猜你喜欢:

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

正当法律程序简史

正当法律程序简史

(美)约翰·V.奥尔特 / 杨明成、陈霜玲 / 商务印书馆 / 2006-8 / 14.00元

本书的主题——正当法律程序,是英美法的核心概念,它使诸如法治、经济自由、个人自治以及免于政府专断行为的侵害等价值观念具体化,因而是法学领域一个永恒的主题,数百年以来一直是法学家、法官及律师关注的重点。本书以极为简洁、精确的语言总结了五百年法律发展的恢弘历史,为人们描述了正当法律程序观念发展演变的清晰轨迹。而沿着这条轨迹,人们可以准确地了解正当法律程序这一重要概念所包含的广泛的问题。 作为一本......一起来看看 《正当法律程序简史》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

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

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具