01-曹操献刀:工厂方法模式

2.1、模式背景故事

  曹操从王允处借七星宝刀刺杀董卓

2.2、模式定义

  所谓工厂方法模式(Factory Method Pattern),就是定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。

  工厂方法模式是对简单工厂模式进行了抽象。如此一来核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。工厂方法模式完全实现“开-闭”原则,对扩展开放,对修改关闭。在不影响现有软件结构的基础上实现了扩展,可应用于更复杂的层次结构和产品结果复杂的场合。

2.3、工厂方法模式的静态建模

  大司徒王允---抽象工厂

  各类宝刀---抽象产品

  校尉曹操---具体工厂

  七星宝刀---具体产品

  

  图中所描述的内容是:抽象工厂ISwordFactory生产抽象产品AbstractSword,具体工厂Caocao生产具体产品QixingSword;具体工厂Caocao实现抽象工厂ISwordFactory接口,具体产品QixingSword是抽象产品的一个子类。这也就是我们故事中蕴含的工厂方法设计模式!

2.4、故事的工厂方法模式实现

2.4.1)建立产品

1)抽象宝刀---AbstractSword

package com.demo.factory.model;

/**
 * Created by lsq on 2018/3/12.
 * 定义抽象宝刀
 */
public abstract class AbstractSword {

    //宝刀的名称
    private String name;

    //抽象父类的构造方法
    public AbstractSword(){
    }

    //获得宝刀名称
    public String getName(){
        return name;
    }

    //设置宝刀名称
    public void setName(String name){
        this.name = name;
    }

}

2)具体宝刀---QixingSword七星宝刀

package com.demo.factory.model.object;

import com.demo.factory.model.AbstractSword;

/**
 * Created by lsq on 2018/3/12.
 * 七星宝刀
 */
public class QixingSword extends AbstractSword {

    /**
     * 构造方法设置宝刀的名称
     */
    public QixingSword(){
        this.setName("七星宝刀");
    }

}

2.4.2)建立工厂

1)抽象宝刀工厂---ISwordFactory生产抽象宝刀

package com.demo.factory.itf;

import com.demo.factory.model.AbstractSword;

/**
 * Created by lsq on 2018/3/12.
 * 宝刀工厂
 */
public interface ISwordFactory {

    /**
     * 生产各类宝刀(返回值是抽象宝刀类型)
     * @return
     */
    public AbstractSword createSword();

}

2)具体宝刀工厂---Caocao生产七星宝刀

package com.demo.factory;

import com.demo.factory.itf.ISwordFactory;
import com.demo.factory.model.AbstractSword;
import com.demo.factory.model.object.QixingSword;

/**
 * Created by lsq on 2018/3/12.
 * 曹操具体工厂
 */
public class Caocao implements ISwordFactory{

    /**
     * 实现ISwordFactory接口的createSword方法,生产七星宝刀
     * @return
     */
    public AbstractSword createSword() {
        return new QixingSword();
    }

}

2.4.3)测试

1)运行

import com.demo.factory.Caocao;
import com.demo.factory.itf.ISwordFactory;
import com.demo.factory.model.AbstractSword;

/**
 * Created by lsq on 2018/3/12.
 *
 */
public class MainApp {

    public static void main(String[] args) {
        //创建曹操实例对象(返回使用接口类型ISwordFactory)
        ISwordFactory swordFactory = new Caocao();
        //获得宝刀实例-七星宝刀
        AbstractSword sword = swordFactory.createSword();
        //刺杀董卓
        System.out.println("曹操使用"+sword.getName()+"刺杀董卓!");
    }

}

  运行结果:

  

2)使用八星宝刀来考验模式

1)创建八星宝刀---BaxingSword

package com.demo.factory.model.object;

import com.demo.factory.model.AbstractSword;

/**
 * Created by lsq on 2018/3/12.
 * 八星宝刀
 */
public class BaxingSwrod extends AbstractSword{

    /**
     * 构造方法设置宝刀的名称
     */
    public BaxingSwrod(){
        this.setName("八星宝刀");
    }

}

2)创建八星宝刀工厂---Caocao2生产八星宝刀

package com.demo.factory;

import com.demo.factory.itf.ISwordFactory;
import com.demo.factory.model.AbstractSword;
import com.demo.factory.model.object.BaxingSwrod;

/**
 * Created by lsq on 2018/3/12.
 * 曹操具体工厂
 */
public class Caocao2 implements ISwordFactory{

    /**
     * 实现ISwordFactory接口的createSword方法,生产八星宝刀
     * @return
     */
    public AbstractSword createSword() {
        return new BaxingSwrod();
    }

}

3)测试结果

  

  在这一系列的变化过程中,应用的是程序设计语言中的多态方式,使用接口调用对象实例的具体方法,获得不同对象内容,而对外部是表现一致的(相同的方法),这也是面向接口编程的优点。

  像这种不在工厂中产生具体的对象实例,而是将实例化的工作推迟到工厂子类中,这种模式被称做工厂方法模式。

我们可以这样理解工厂方法设计模式:

1)抽象工厂生产抽象产品(ISwordFactory生产AbstractSword),具体工厂生产具体产品(Caocao类生产QixingSword);

2)抽象对具体(具体类实现抽象类,如Caocao类实现ISwordFactory;QixingSword继承AbstractSword)。

2.6使用场合

  (1)当子类型可能会很多,以后需要不断增添不同的子类实现时;

  (2)当一个系统尚在框架设计阶段,还不知道将来需要实例化哪些具体类时;

  (3)系统设计之初不需要具体对象的概念(或者说没有具体对象的概念)。

  以上几种情况比较适合工厂方法设计模式。通过子类来创造对象,工厂方法模式在此过程中负责将客户端从具体类型中解耦,客户端只需要知道他们使用对象的抽象类型就可以了,而不必关心具体的对象类型,具体的对象类型由工厂子类负责创建。

  

原文地址:https://www.cnblogs.com/danielleee/p/8550705.html

时间: 2024-10-23 03:15:59

01-曹操献刀:工厂方法模式的相关文章

JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)

简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实现添加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍另外一种工厂模式--工厂方法模式. 1 日志记录器的设计 Sunny软件公司欲开发一个系统执行日志记录器(Logger).该记录器能够通过多种途径保存系统的执行日志,如通过文件记录或数据库记录,用户能够通过改动配置文件灵活地更换日志记录方式. 在设

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

工厂方法模式 返回设计模式目录 阅读目录: 简单工厂模式 介绍 UML类图 参考代码 总结 工厂方法模式 介绍 UML类图 参考代码 总结 前言: <大话设计模式>里有一小节叫'活字印刷,面向对象'的,讲了一个小故事,大意如下: 话说三国时期,曹操带领大军驻扎于赤壁.军船相连,气势恢宏,眼看要灭掉东吴,统一天下,曹操甚悦,于是大宴群臣.席间曹操诗兴大发,不觉吟道:"喝酒唱歌,人生真爽.--".众文武齐呼:"丞相好诗!".于是一臣子速命印刷工匠刻板印刷,以

简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想

菜鸟D在项目中遇见一个比较纠结的高耦合,所以就想办法来解耦.情况是这样的:系统通过用户选择treeview控件的节点判断调用不同的处理,这些处理中某些东西又是类似的.同事的建议是采用简单工厂,耦合就耦合吧,反正treeview节点基本是不会变化的.(能偷懒就偷懒吧) 菜鸟D有些偏执,想找些方法来解耦.于是就学习了这个几种方法,虽然不一定用的上,多学一点总是好的. 首先说简单工厂,例子是一个已经二到死的计算器. 简单工厂由三种角色组成:工厂类角色(creator),抽象产品类角色(product,

C#设计模式——工厂方法模式

一.引言 在简单工厂中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的. 二.工厂方法模式的实现 工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的

工厂方法模式

开放-封闭原则: 在设计模式中,对于不能修改,但可以扩展的思想也是一种重要的设计原则.比如国家对于香港的一国两制.大陆的社会主义是不可以更改的,但由于香港长期处于资本主义下,强制执行社会主义难免有些牵强,所以邓小平同志就用了开放-封闭原则,完美的解决了这一问题.在前期进行软件设计的时候,应该做好后期新增需求的准备.尽量做到新增需求时,不需要更改已有代码,而是新增代码,进行需求的扩展. 工厂方法模式: 问题抛出:在上一篇文章中,通过一个简单的两位数计算介绍了简单工厂模式.在这基础上,试想如果我们需

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

java语言实现创建型设计模式—工厂方法模式

一.描述 基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建. 在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类.实现抽象工厂类的具体工厂类.抽象类.实现抽象类的具体类. 二.工厂方法模式的优缺点 优点:在工厂方法模式中,创建对象的任务由具体的工

设计模式三:工厂方法模式

疑惑解答: 1.interface接口不能够实例化(new),但是可以定义引用来指向继承该接口的实体类: 如: interface animal{ void eat(); } class Cat implements animal{ public void eat(){ System.out.println("The cat eat!"); } } animal an = new Cat(); 一.什么是工厂方法模式 1.是简单工厂模式的进一步抽象: 2.定义一个创建产品对象的工厂接口

大话设计模式-第八章-工厂方法模式

一.UML图 二.包含的角色 (1)抽象工厂 (2)具体工厂 (3)抽象产品 (4)具体产品 三.优势 (1)工厂方法模式是对简单工厂模式的稍微的改进.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中. (2)与简单工厂模式相比,制造产品的工厂类不再 只有一个,而是每种具体产品类都对应一个生产它的具体工厂类.而这些具体工厂类的共同特征再被提取出来形成一个抽象产品类,这些具体产品类都继承自这个抽象产品类. (3)当需要增加一种产品的时候,需要做的是:增加一种继承自抽象产品