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

来源:互联网 发布:武汉大学张梦婷 知乎 编辑:程序博客网 时间:2024/06/03 02:27

1.解析

定义: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类.

UML :

这里写图片描述

适用性:

(1) 一个系统要独立于它的产品的创建、组合和表示时。
(2) 一个系统要由多个产品系列中的一个来配置时。
(3) 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
(4) 当你提供一个产品类库,而只想显示它们的接口而不是实现时。


2.实例

实例说明 :
接着上一篇,新店经过装修后,重新开张! 根据现代人们的健康需求,新店重新进行了规划,划分为了素食区和肉食区. 让人们更注意自己的身体力行,更符合当代人的需求.

图示说明 :

这里写图片描述

$ 1 . 面类食品

(1) 面类食品实现 (车间1) : 安排制作面类食品

package foods;public abstract class MianFenGuan { /**  * 角色: 面食主任  * 任务: 安排制作面食  * 目的:   */    public abstract void makeMianFood();    //制作素面    public  void makeSuMian(){}    //制作肉面    public void makeRouMian(){}    //制作肉饺子    public void makeRouJiaoZi(){}    //制作素饺子    public void makeSuJiaoZi(){}}

(2) 面类食品 : 素食

package mianfenfoods;import foods.MianFenGuan;public class SuMianDaChu extends MianFenGuan {    /**     * 角色: 素面大厨     * 任务: 制作素面     * 目的:     */    @Override    public void makeMianFood() {      System.out.println("素面制作中,请稍后.............");    }    @Override    public void makeSuMian() {        System.out.println("我是素面大厨,素面制作好了 :)");    }    @Override    public void makeSuJiaoZi() {        System.out.println("我是素面大厨,素饺子制作好了 :)");    }}

(3) 面类食品: 肉食

package mianfenfoods;import foods.MianFenGuan;public class RouMianDaChu extends MianFenGuan {    /**     * 角色: 肉面大厨     * 任务: 制作有关面食和肉类的食物     * 目的:      */    @Override    public void makeMianFood() {         System.out.println("肉面正在制作中,请稍后................");    }    @Override    public void makeRouMian() {         System.out.println("我是肉面大厨,肉面制作好了:)");    }    @Override    public void makeRouJiaoZi() {         System.out.println("我是肉面大厨,肉饺子制作好了:)");    }}

$ 2. 米类食品

(1) 米类食品(车间1) : 安排制作任务

package foods;public abstract class RiceGuan {    /**     * 角色: 米饭主任     * 任务: 安排米饭和炒菜的制作     * 目的:      */    //必须上的米饭    public abstract void makeRiceFood();    //炒肉    public void chaoRou(){}    //炒菜    public void chaoCai(){}}

(2) 米类食品 : 素菜

package ricefoods;import foods.RiceGuan;public class ChaoCaiDaChu extends RiceGuan {    /**     * 角色: 炒菜大厨     * 任务: 为米饭炒菜     * 目的:     */    @Override    public void makeRiceFood() {        System.out.println("炒菜正在炒中,请稍后...........");    }    @Override    public void chaoCai() {        System.out.println("我是炒菜大厨,菜炒好了:)");    }}

(3) 米类食品 : 肉食

package ricefoods;import foods.RiceGuan;public class ChaoRouDaChu extends RiceGuan {    /**     * 角色: 炒肉大厨     * 任务: 为米饭炒肉     * 目的:      */    @Override    public void makeRiceFood() {       System.out.println("炒肉正在炒中,请稍后............");    }    @Override    public void chaoRou() {        System.out.println("我是炒肉大厨,肉炒好了:)");    }}

$ 3. 后厨主任登场

(1) 总工厂: 后厨主任 , 安排任务

package factory;import foods.MianFenGuan;import foods.RiceGuan;public abstract class ServiceFactorys {    /**     * 角色: 后厨主任     * 任务: 管理任务菜     * 目的:     */    public abstract MianFenGuan getMianFenFood();    public abstract RiceGuan getRiceFood();}

(2) 子工厂 : 制作 素食 食品

package factorys;import ricefoods.ChaoCaiDaChu;import mianfenfoods.SuMianDaChu;import factory.ServiceFactorys;import foods.MianFenGuan;import foods.RiceGuan;public class SuFactory extends ServiceFactorys {    /**     * 角色: 素食服务员     * 任务: 专为素食区服务     *      */    @Override    public MianFenGuan getMianFenFood() {        //素面食        return new SuMianDaChu();    }    @Override    public RiceGuan getRiceFood() {        //素米饭        return new ChaoCaiDaChu();    }}

(3) 子工厂 : 制作肉类 食品

package factorys;import ricefoods.ChaoRouDaChu;import mianfenfoods.RouMianDaChu;import factory.ServiceFactorys;import foods.MianFenGuan;import foods.RiceGuan;public class RouFactory extends ServiceFactorys {    /**     * 角色: 肉类食品服务员     * 任务: 专为肉食区服务     * 目的:     */    @Override    public MianFenGuan getMianFenFood() {        // 肉食,面食区        return new RouMianDaChu();    }    @Override    public RiceGuan getRiceFood() {        // 肉食,米食区        return new ChaoRouDaChu();    }}

$ 4. 大厅经理 测试

(1) 简单工厂: 帮助类实现,实例化子工厂

package factory;public class ShangFanAndCai {    private final static String ROU_FACTORY_NAME = "factorys.RouFactory";    private final static String SU_FACTORY_NAME = "factorys.SuFactory";    private final static String ROU_NAME = "rou";    private final static String SU_NAME = "su";    public static ServiceFactorys getServiceFactoryInstence(String type) {        try {            if (ROU_NAME.equals(type)) {                return (ServiceFactorys) Class.forName(ROU_FACTORY_NAME)                        .newInstance();            } else if (SU_NAME.equals(type)) {                return (ServiceFactorys) Class.forName(SU_FACTORY_NAME)                        .newInstance();            } else {                return null;            }        } catch (Exception e) {            System.out.println(e.getMessage());        }        return null;    }}

(2) 测试类 实现 : 大厅经理

package demo;import factory.ServiceFactorys;import factory.ShangFanAndCai;import foods.MianFenGuan;import foods.RiceGuan;public class AbstractFactroyTest {    /**     * 新店经过装修后,重新开张! 根据现代人们的健康需求,新店重新进行了规划,划分为了素食区和肉食区. 让人们更注意自己的身体力行,更符合当代人的需求.     */    private final static String ROU_NAME = "rou";    private final static String SU_NAME = "su";    /**     * 角色 : 大厅经理 目的 : 收银,通知上菜     *      * @param args     */    public static void main(String[] args) {        //拿到 后主主任 : 肉类制作后厨,下面的肯定都是制作肉类食物        ServiceFactorys rouFactory = ShangFanAndCai                .getServiceFactoryInstence(ROU_NAME);        //后厨主任 通知 面食主任 : 上的肯定是肉类+面食        MianFenGuan mianFenGuan = rouFactory.getMianFenFood();        mianFenGuan.makeMianFood();        mianFenGuan.makeRouJiaoZi();        mianFenGuan.makeRouMian();        //后厨主任 通知 米饭主任 : 上的肯定是肉类+米饭        RiceGuan riceGuan=rouFactory.getRiceFood();        riceGuan.makeRiceFood();        riceGuan.chaoRou();    }}

3.优缺点

优点:
1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性


4.工厂模式总结

相同点:
1、 都是为客户调用程序与具体的对象类型之间提供了一个解耦作用,这里怎么说呢?其实就是应用程序不关心这个对象是怎么出来的,只关系如何使用这个对象,而且以后就算对象发生变化,那么也不需要修改用户应用程序的代码。

2、提高了程序的可维护性和低耦合性

异同点:
1、 简单工厂模式:是简单的一些列没有任何依赖关系的对象的创建,内部包含复杂的逻辑关系,一半是通过配置或者参数来进行创建对象,适合对象类型不多,并且不会经常新增的情况下。
工厂模式:每个工厂负责具体类型对象的创建,提供了可以动态新增产品类型的创建,并不需要修改现有的程序就可以无缝的新增产品类型。

抽象工厂模式:支持动态的新增对象类型和新增工厂类型,实现多种依赖关系的对象或者组合关系的创建,适合现有项目中的对象创建过程。

2、简单工厂模式:内部逻辑复杂,不符合高内聚的原则。
工厂模式:每次新增一个对象类型,就必须新增一个对应的创建工厂,无疑这是一个非常大的工作量。
抽象工厂模式:是在简单工厂模式的基础上经过改进具有前2个模式的优点,又屏蔽了他们的一些缺点。


5.Demo免积分下载

http://download.csdn.net/detail/lablenet/9291255

0 0
原创粉丝点击