设计模式演练——抽象工厂模式

1.小C的故事

下面讲述的是关于x星系喵星和汪星两个宿敌星球之间的故事。首先把镜头聚焦到喵星,它是主角登场的地方。(本故事纯属虚构,如有雷同,纯属巧合) 
       喵星纪元9035年,汪星精锐舰队聚集在近喵星轨道,企图一举拿下喵星。大部分喵星人已经被转移到防空工事中。喵星国王下令出动最强战力迎击来敌。喵小c是战斗机编队到王牌飞行员,参加了上百场战斗,获得了很多荣誉,他是本次先头部队的一员。 
       “装载初级武器,装载初级防御罩,装载初级逃生仓。准备完毕,出发!”,航空港的扩音机发出急促的声音。伴随着引擎的轰鸣,战斗机编队已经离开跑道,朝汪星舰队飞去。下面是当前的源代码:

这个是战斗机的代码,喵小c就坐在飞机里,所以代码就省了。

/**
 * 战斗机
 * @author bob
 *
 */
public class Battleplane {
    /**
     * 初级逃生舱
     */
    private PrimaryEscapeCompartment primaryEscapeCompartment;

    /**
     * 初级防御罩
     */
    private PrimaryShield primaryShield;

    /**
     * 初级武器
     */
    private PrimaryWeapon primaryWeapon;

    public PrimaryEscapeCompartment getPrimaryEscapeCompartment() {
        return primaryEscapeCompartment;
    }

    public void setPrimaryEscapeCompartment(PrimaryEscapeCompartment primaryEscapeCompartment) {
        this.primaryEscapeCompartment = primaryEscapeCompartment;
    }

    public PrimaryShield getPrimaryShield() {
        return primaryShield;
    }

    public void setPrimaryShield(PrimaryShield primaryShield) {
        this.primaryShield = primaryShield;
    }

    public PrimaryWeapon getPrimaryWeapon() {
        return primaryWeapon;
    }

    public void setPrimaryWeapon(PrimaryWeapon primaryWeapon) {
        this.primaryWeapon = primaryWeapon;
    }

}
 

下面是战斗机需要装备的设备

/**
 * 初级逃生舱
 *
 * @author bob
 *
 */
public class PrimaryEscapeCompartment {

    public String description() {
        return "逃生能力一般";
    }
}

/**
 * 初级防护罩
 *
 * @author bob
 *
 */
public class PrimaryShield {

    public String protect(){
        return "防御了一次攻击,但是防御罩受损";
    }
}

/**
 * 初级武器
 * @author bob
 *
 */
public class PrimaryWeapon {

    public String shoot(){
        return "突突突";
    }

}
 

下面是战斗机起飞的机场

 package com.bob.designpatterns.abstractfactory.stepone;

/**
 * 机场
 * @author bob
 *
 */
public class Airport {

    public static void main(String[] args) {
        //起飞前的准备
        Battleplane battleplane = new Battleplane();
        prepareToFly(battleplane);

        //起飞
    }

    /**
     * 战斗机起飞前的准备工作
     * @param battleplane
     */
    public static void prepareToFly(Battleplane battleplane){
        battleplane.setPrimaryEscapeCompartment(new PrimaryEscapeCompartment());
        battleplane.setPrimaryShield(new PrimaryShield());
        battleplane.setPrimaryWeapon(new PrimaryWeapon());
    }

}
 

像大部分的剧情一样,喵星的首轮自卫反击战以失败落幕,喵小c顶着主角光环成功飞回。
       “中级战斗装备研制完成,马上装备到战斗机上了”,战斗后勤部得到了上级通知,同时愁上心头….WHY?

2.存在的问题

请看Airport类中prepareToFly中负责产生战斗装备(直接new了),紧密得耦合在一起。另外请看Battleplane类中也与初级的装备耦合严重。除了耦合问题以外战斗装备分为多个部分,替换的时候容易漏替,要知道初级战斗装备和中级战斗装备之间不能混搭,一旦搭错将会出现不兼容的情况,给战斗机带来额外风险。所以要解决两个问题:1.保证灵活得升级现有装备 2.要按照级别统一升级,不能有部分升级的情况。

3.抽象工厂模式登场

抽象工厂模式的意图:提供一个创建一系列相关或者相互依赖的对象的接口,而无需指定他们具体的类。 听起来略微有些抽象,我们继续讲故事。

让我们将时间回退到1年前的喵星。改变历史,解决1年后的困境。我门重新设计一下:

经过酝酿,新的设计出现了:抽象工厂模式常见的实现方式是使用工厂方法模式实现,也可以使用原型模式实现。本文中的实现方式为前者。关于原型模式的实现方式,下一篇写完原型模式后会补充上来。

下面只给出Airport部分代码,完整代码在https://github.com/mingbozhang/designpattern

package com.bob.designpatterns.abstractfactory.steptwo;

/**
 * 机场
 *
 * @author bob
 *
 */
public class Airport {

    /**
     * 战斗准备系统
     */
    private static FightPrepareSys fightPrepareSys;

    public static void setFightPrepareSys(FightPrepareSys fightPrepareSys) {
        Airport.fightPrepareSys = fightPrepareSys;
    }

    public static void main(String[] args) {
        // 设置初级战斗准备系统
        // Airport.setFightPrepareSys(new PrimaryFightPrepareSys());
        // 设置中级战斗准备系统
        Airport.setFightPrepareSys(new MidFightPrepareSys());

        // 起飞前的准备
        Battleplane battleplane = new Battleplane();
        prepareToFly(battleplane);

        // 起飞
    }

    /**
     * 战斗机起飞前的准备工作
     *
     * @param battleplane
     */
    public static void prepareToFly(Battleplane battleplane) {
        battleplane.setEscapeCompartment(fightPrepareSys.getEscapeCompartment());
        battleplane.setShield(fightPrepareSys.getShield());
        battleplane.setWeapon(fightPrepareSys.getWeapon());
    }

}

4.解决了什么,失去了什么

引入抽象工厂后,对于多个系列的产品(对应故事中战斗装备各系列)更容易管理,限制取得产品与同系列产品版本风格保持一致。使创建产品与使用者解藕,根据抽象类进行交互。 
       如果想要新增加一个产品的创建,且同时保证使用者的简洁实用,则比较困难。

5.具体应用场景

如果一个系统需要对应多个系列的产品则可以使用抽象工厂模式。举个《设计模式》书中的例子:当制作一款编辑器界面包含多种风格,界面元素包括各个控件,如:按钮、滚动条等。可以创建一个抽象的WidgetFactory包含创建各种控件的抽象方法。具体风格再实现Style1WidgetFactory、Style2WidgetFactory,生产各自风格系列的具体控件。这样就达到风格可以灵活扩展,且切换风格的时候非常简单,整个系统中只有在初始化具体工厂的时候需要改动。

6.参考

《设计模式-可复用面向对象软件的基础》

时间: 2024-10-01 03:31:45

设计模式演练——抽象工厂模式的相关文章

设计模式之抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置. 他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离. 下面的代码还使用了反射与XML. 代码如下: using System; using System.Collections.Ge

设计模式之抽象工厂模式20170803

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

大话设计模式_抽象工厂模式(Java代码)

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. 简单描述:有多种抽象产品,并且每种抽象产品都有多个具体产品.一个抽象工厂,提供多个具体工厂,每个工厂则提供不同种类的具体产品. 大话设计模式中的截图: 例子代码: AbstractProductA类: 1 package com.longsheng.abstractfactory; 2 3 public abstract class AbstractProductA { 4 5 public abstract v

设计模式三—抽象工厂模式

设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是园丁2的杰作 1.Fruit.java public interface Fruit { /* * 生长 * 收获 * 栽种 */ public void grow(); public void harvest(); public void plant(); } 2.Apple.java publi

设计模式之抽象工厂模式(Abstract Factory)

1.定义 抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.类图 由于类太多就不上源码了~ 最佳实践: 在一个应用中,需要在三个不同平台(Windows.Linux.Android)上运行,通过抽象工厂模式屏蔽掉操作系统对应的影响三个不同操作系统上的软件功能.应用逻辑.UI都应该是非常类似的,唯一不同的是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息. 设计模式之抽象工厂模式(Abstract Factory)

C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

原文:C#设计模式之三抽象工厂模式(AbstractFactory)[创建型] 一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简单工厂]模式所面对的问题,它的问题就是:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越多,其逻辑越复杂,同时这样的修改也是不符合[开放关闭原则OCP],对修改代码关闭,对增加代码开放.为了解决[简单工厂

设计模式——4.抽象工厂模式

1. 模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象. 为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体

设计模式之抽象工厂模式(c++)

问题描述 假设我们要开发一款游戏, 当然为了吸引更多的人玩, 游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心理).于是我们就可以采用这样一种处理策略: 为游戏设立等级,初级.中级.高级甚至有BT 级. 假设也是过关的游戏, 每个关卡都有一些怪物( monster) 守着, 玩家要把这些怪物干掉才可以过关. 作为开发者, 我们就不得不创建怪物的类, 然后初级怪物. 中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同).

【设计模式】抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类.每个生成的工厂都能按照工厂模式提供对象. 介绍 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决:主要解决接口选择的问题. 何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品