关闭

设计模式之工厂方法模式(Factory Method)

标签: 设计模式重构工厂方法工厂模式
415人阅读 评论(0) 收藏 举报
分类:

1.解析

简单工厂并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法。

这里写图片描述

区别说明 :

工厂方法和简单工厂的主要区别如下 :

(1) 简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面;
(2) 这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,**互相不受影响;
(3) 以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。


2.实例

实例说明 :
餐馆的例子 : 大厅经理接收点菜单 -> 给后厨主任菜单通知做菜 -> 服务员去端菜.简单的说明下工厂方法模式.

$. 后厨风波

(1) 实现产品接口 : 后厨主任, 告知做饭,说话任务

/**
 * 角色:后厨主任
 * 任务:告知制作什么食物
 * 目的:统一制作什么产品
 * @author yuan
 *
 */
public abstract class Foods {
    /**
     * 都要实现的工作,做饭
     */
    public abstract void makeFood();

    /**
     * 非都可实现的工作,说话
     */
    public void sayHello(){}
}

(2) 实现单一产品 : 饺子大厨, 制作饺子,还可以说话

public class JiaoziDaChu extends Foods {

    /**
     * 角色 : 饺子大厨
     * 任务 : 制作饺子
     * 目的 : 实现Foods接口,知道自己干什么
     */

    @Override
    public void makeFood() {
         System.out.println("热腾腾的饺子出锅了:)");
    }

    @Override
    public void sayHello() {
        //饺子大厨说
        System.out.println("我是饺子大厨 : 同志们好啊!");
    }

}

(3) 实现单一产品 : 面条大厨 , 制作面条

public class MianTiaoDaChu implements Foods {

    /**
     * 角色 : 面条大厨
     * 任务 : 制作面条
     * 目的 : 实现Foods接口,知道自己干什么
     */

    @Override
    public void makeFood() {
      System.out.println("热腾腾的面条做好了:)");
    }

}

(4) 实现单一产品: 馒头大厨, 制作馒头

public class ManTouDaChu extends Foods {

    /**
     * 角色 : 馒头大厨
     * 任务 : 制作馒头
     * 目的 : 实现Foods接口,知道自己干什么
     */

    @Override
    public void makeFood() {
       System.out.println("热腾腾的馒头出炉了:)");
    }

}

$. 服务风波 : 服务员听从大厅经理的话

(5) 实现总的任务 : 大厅经理 命令干活

/**
 *角色:大厅经理
 *任务:通知上菜
 *目的:工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能
 * @author yuan
 *
 */
public abstract class ServiceFactorys {
     //端菜去
    public abstract  Foods getFood();

     //说出是谁
    public  void sayWho(){}

    //说出的年龄
    public void sayAge(){}
}

(6) 实现单一职责 : 饺子服务员,上菜,说名字

public class JiaoZiService extends ServiceFactorys {

    /**
     *角色:饺子专门服务员
     *任务:去后厨拿饺子
     *目的:单一的生产一种产品
     */

    @Override
    public Foods getFood() {
        return new JiaoziDaChu();
    }

    @Override
    public void sayWho() {
        System.out.println("我是 饺子专门服务员 :(");
    }

}

(7) 实现单一职责 : 面条服务员,上菜,说名字

public class MianTiaoService extends ServiceFactorys {

    /**
     *角色:面条专门服务员
     *任务:去后厨拿面条
     *目的:单一的生产一种产品
     */

    @Override
    public Foods getFood() {
        return new MianTiaoDaChu();
    }

    @Override
    public void sayWho() {
        System.out.println("我是 面条专门服务员 :(");
    }
}

(8) 实现单一职责 : 馒头服务员 , 上菜,说名字,说年龄

public class ManTouService extends ServiceFactorys {

    /**
     *角色:馒头专门服务员
     *任务:去后厨拿馒头
     *目的:单一的生产一种产品
     */

    @Override
    public Foods getFood() {
        return new ManTouDaChu();
    }

    @Override
    public void sayWho() {
        System.out.println("我是 馒头专门服务员 :(");    
    }

    @Override
    public void sayAge() {
        System.out.println("我今年20岁!");  
    }

}

$. 用户点饭, 大厅经理告知 上饭

(9) 实现测试 : 用户点菜, 服务上菜

/**
 * 设计模式之工厂方法模式
 */
public class TestDemo {

    /**
     * 角色: 用户
     * 任务: 点菜
     * 目的: 测试
     */

    public static void main(String[] args) {

        ServiceFactorys factorys=new JiaoZiService();
        JiaoziDaChu jiaoziDaChu= (JiaoziDaChu) factorys.getFood();
        jiaoziDaChu.makeFood();
        jiaoziDaChu.sayHello();

        ServiceFactorys mantoufactorys=new ManTouService();
        mantoufactorys.sayWho();
        mantoufactorys.sayAge();
        mantoufactorys.getFood().makeFood();

    }

}

$. 关门数钱

(10) 实例小结
后厨主任 : 实现需要做的任务,必须实现的和非必要实现的任务,主要工作时安排大厨任务.
饺子,面条,馒头大厨 : 任务是做不同的产品.除了做产品,还可以去实现其他方法,比如说话.包含有和具体业务逻辑有关的代码实现。
大厅经历 : 安排服务员任务。
饺子,面条,馒头服务员:必须任务端菜.除了端菜,还可以实现其他方法。包含必要的业务逻辑和代码实现。

结果 :

这里写图片描述


3.优缺点

优点 :
(1)工厂方法模式类允许子类来决定实例化哪一个类.
(2)代码灵活,松耦合和可复用性,将对象创建的代码从客户端移到了工厂类,那就是它的子类。这非常易于维护相关代码,因为对象的创建非常集中。
(3)客户端代码只处理产品的接口,因此可以无需修改客户端的逻辑代码就能添加任何具体的产品。
(4)工厂方法的优势之一就是可以多次返回相同的实例,或者可以返回一个子类而不是一个具体类型的对象。

缺点 :
在可维护性上,可扩展性上是非常差的。


4.用途

使用场景 :
(1)对象的创建如果需要代码复用却没有现成的代码可用时,工厂方法设计模式就派上用场了。
(2)类并不知道需要创建的是什么子类。
(3)子类可以指定应该创建什么样的对象。
(4)父类会委托它的子类创建对象。

模式应用 :
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
例如 : Java Collection中的iterator() 方法即属于这种情况。

第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。


5.Demo免积分下载

接口模式demo :
http://download.csdn.net/detail/lablenet/9281223

抽象类模式demo :
http://download.csdn.net/detail/lablenet/9291275

0
0
查看评论

Java设计模式之工厂方法模式【Factory Method Pattern】

工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
  • Lixuanshengchao
  • Lixuanshengchao
  • 2016-05-04 21:27
  • 959

软件设计模式——工厂方法模式(Factory Method)

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。通俗的来说就是把简单工厂模式里面的分支语句给去掉,将每个具体产品的实例化过程放到相应的产品中去。相应的角色如下: (1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。...
  • Jungle_hello
  • Jungle_hello
  • 2016-04-13 22:51
  • 900

浅谈JAVA设计模式之——工厂方法(FactoryMethod)

一、概述             定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。       二...
  • l1028386804
  • l1028386804
  • 2015-05-02 17:27
  • 1143

设计模式之Factory Method(工厂方法模式)

<br />心类成为一个抽象工厂角色.仅负责具体工厂子类必须实现的接口.这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品.<br />二、 工厂方法模式角色与结构<br />1. 抽象工厂(Creator)角色:是工厂方法...
  • dy_paradise
  • dy_paradise
  • 2010-12-09 09:56
  • 387

设计模式之工厂方法模式(Factory Method)

工厂方法模式(Factory Method)的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
  • u014375869
  • u014375869
  • 2014-10-05 13:38
  • 300

【设计模式】-工厂方法模式-Factory Method

简介工厂方法模式(Factory Method)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。 工厂方法模式的意义是...
  • tailyou
  • tailyou
  • 2015-09-17 16:12
  • 250

设计模式之工厂方法模式---factory method

模式的介绍模式的定义Define an interface for creating an object,but let subclassed decide which class to instantiate.Factory Method lets a class defer instantiat...
  • hfreeman2008
  • hfreeman2008
  • 2015-08-26 22:08
  • 919

设计模式-工厂方法模式(Factory Method)

应用场景: 1.类不知道自己要创建哪一个对象 2.类用它的子类来指定创建哪个对象 3.客户需要清楚创建了哪一个对象 优点: 1、多态性:客户代码可以做到与特定应用无关,适用于任何实体类。 2、子类提供挂钩。基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。--&...
  • zdongfuyu
  • zdongfuyu
  • 2015-07-21 17:19
  • 261

设计模式 - 工厂方法模式(Factory Method)

工厂方法模式(Factory Method) 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。引入多态创建对象。 一个层次中的类都有相似实现一个方法(AnOperation), 只是这个方法中对象创建的步骤不同。工厂方法通常在模板方法中...
  • mrszsongzi
  • mrszsongzi
  • 2017-04-01 19:18
  • 235

设计模式之(Factory method)工厂方法模式

1.需求 开发一个测试工具专门用于测试手机,测试流程打开分为以下几步:测试开机速度->测试屏幕亮度->测试相机效果。手机有很多种品牌:三星、小米、魅族等等。 2. 分析 不同的手机的测试流程是一样的。我们可以将不变的测试流程和具体的手机隔离起来,当需要检测新的品牌的手...
  • ayangke
  • ayangke
  • 2014-11-18 20:23
  • 580
    个人资料
    • 访问:663154次
    • 积分:9312
    • 等级:
    • 排名:第2347名
    • 原创:395篇
    • 转载:15篇
    • 译文:0篇
    • 评论:193条
    微信(WeChat)
    博客专栏
    最新评论