每天一个设计模式-5 工厂方法模式

每天一个设计模式-5 工厂方法模式

1.模式定义

定义一个用于创建对象的接口,让子类决定实例化那一个类,Factory Method使一个类的实例化延迟到其子类

2.工厂方法模式解决问题的思路

工厂方法模式需要接口对象,那就定义一个方法来创建这个接口对象(工厂方法);可是事实上它自己是不知道如何创建这个接口对象的,没有关系,定义成抽象方法让子类来实现就可以了;这样这个对象本身就可以只是面向接口编程,而无需关心到底如何创建接口对象了。

3.实际问题

实现一个导出数据的功能,客户选择数据的导出格式,根据客户选择的导出格式自动导出格式正确的数据。

4.类图

5.源代码

//抽象类
public abstract class ExportOpera {

    public ExportOpera(){

    }

    public void finalize() throws Throwable {

    }

    /**
     *
     * @param data
     */
    //这里的返回类型也可以是一个具体对象
    public boolean export(String data){
        //通过调用工厂方法,实例化需要的对象
        ExportFlieApi exportFlieApi = factoryMethod();
        //调用ExportFlieApi接口的export方法
        return exportFlieApi.export(data);
    }
//这里是抽象方法,由子类来实现
    protected abstract ExportFlieApi factoryMethod();

}

ExportOpera

public interface ExportFlieApi {

    /**
     *
     * @param data
     */
    public boolean export(String data);

}

ExportFileApi

public class ExportTxtFlie implements ExportFlieApi {

    public ExportTxtFlie(){

    }

    public void finalize() throws Throwable {

    }

    /**
     *
     * @param data
     */
    public boolean export(String data){
        System.out.println("以TXT格式导出数据"+data);
        return true;
    }

}

ExportTxtFlie

public class ExportDBFlile implements ExportFlieApi {

    public ExportDBFlile(){

    }

    public void finalize() throws Throwable {

    }

    /**
     *
     * @param data
     */
    public boolean export(String data){
        System.out.println("以DB格式导出数据"+data);
        return true;
    }

}

ExportDBFlile


//ExportOpera的子类之一
public class ExportTxtFileOperate extends ExportOpera {

    public ExportTxtFileOperate(){

    }

    public void finalize() throws Throwable {
        super.finalize();
    }

    protected ExportFlieApi factoryMethod(){
        System.out.println("在子类中创建了"+this.getClass().getName());
        return new ExportTxtFlie();
    }

}

ExportTxtFileOperate

//Export的子类之一
public class ExportDBFileOperate extends ExportOpera {

    public ExportDBFileOperate(){

    }

    public void finalize() throws Throwable {
        super.finalize();
    }

    protected ExportFlieApi factoryMethod(){
        System.out.println("在子类中创建了"+this.getClass().getName());
        return new ExportDBFlile();
    }

}

ExportDBFileOperate



public class Client {

    public static void main(String[] args) {
        ExportOpera eo = new ExportTxtFileOperate();//选择一种输出格式

        eo.export("测试数据");

        ExportOpera eo2 = new ExportDBFileOperate();

        eo2.export("测试数据");
    }

}

Client

6.测试结果

在子类中创建了ExportTxtFileOperate
以TXT格式导出数据测试数据
在子类中创建了ExportDBFileOperate
以DB格式导出数据测试数据

7.模式讲解

工厂方法模式的主要功能就是让父类在不知道具体实现的情况下,完成自身的调用;而具体的实现延迟到子类来实现

一般工厂方法返回的是被创建对象的接口对象,当然也可以是抽象类或者一个具体类的实例。

参数化工厂方法:通过给工厂方法传递参数,让工厂方法根据参数的不同来创建不同的产品对象,这种情况就被称为参数化工厂方法。当然工厂方法创建的不同的产品必须是同一个Product类型的。源代码就不写了,只是给factory method方法加一个参数,根据参数创建不同的对象。

使用参数化工厂方法,扩展会变得非常容易。可以依靠继承的特性,让子类有选择的覆盖,不覆盖的功能还可以返回去交给父类来实现(当然,你的父类要有默认的实现,此时的父类也已经抽象类了)

8.总结

工厂方法模式的本质就是:延迟到子类来选择实现。

工厂方法模式中的工厂方法,在真正实现的时候,一般是先选择具体使用哪一个具体的产品实现对象,然后创建这个具体产品对象的实例,最后就可以返回去了。也就是说,工厂方法本身并不会去实现产品接口,具体的产品实现是已经写好的了,工厂方法只要去选择实现就好了。

-------博主写博客不容易,转载请注明出处,谢谢:http://www.cnblogs.com/xiemubg/p/5957430.html

时间: 2024-08-03 07:11:48

每天一个设计模式-5 工厂方法模式的相关文章

设计模式之工厂方法模式

anticipate 预料 = except ant蚂蚁 ic ic卡 ip ip卡 ate吃 我没有预料到小蚂蚁把我的ic,ip卡吃掉了. robust 强壮的 = strong ro rong容祖儿  bu不  st石头 容祖儿不喜欢强壮的石头. maintain 维持 = keep main主要的(大陆)  tain 台湾 大陆和台湾维持着若即若离的关系. 设计模式之工厂方法模式 动机:     一个工厂方法factory method定义了一个接口来创建对象,但是让子类去选择创建哪一个,

C#设计模式(3)——工厂方法模式

一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary> /// 菜抽象类 /// </summary> public abstract class Food { // 输出点了什么菜 public abstract void Print(); } /// <summary> /// 西红柿炒鸡蛋这道菜 /// </summary

03.设计模式_工厂方法模式

转载自:http://www.cnblogs.com/zhili/p/FactoryMethod.html 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的. 二.工厂方法模式的实现 工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时

Java设计模式之工厂方法模式(转) 实现是抽象工厂?

Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章]          一 .工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色

【设计模式】——工厂方法模式

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使用一个类的实例化延迟到其子类.根据依赖倒转原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法.然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂.我们在要增加新的功能,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了.这样整个工厂和产品系其实都没有修改的

【大话设计模式】—— 工厂方法模式

一.概念 想象一下我们的寻常见到的工厂,下一个订单,付了订金,一段时间后就能够提货.我们不须要知道工厂是用的什么机器,怎么安排工人的,从哪来的材料,只须要一个订单就好,工厂就能够依照其固定流水线做出我们所须要的产品.设计模式中也有类似的一个大神:工厂方法模式. 以下让我们来认识一下: 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二.UML图 Product(抽象产品) ConcreteProduct(

设计模式【工厂方法模式】

本文介绍设计模式中的[工厂模式].首先介绍工厂模式的作用,工厂模式主要是为创建对象提供过度接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 其中一些资料会将工厂模式,分为三类,这三类的分类为: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 但是某些资料会将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类.所以分为:工厂方法模式(F

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

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

Java设计模式之工厂方法模式

工厂方法模式介绍 有时候,由于产品的多样化,但是产品的功能却有某种共同的联系.我们希望定义一个用于创建产品对象的公共接口,让子类决定去如何实现这个功能.然后,我们定义一个生产产品的"工厂",所有的产品将从这个工厂里面生产出来,这样我们就使得产品的构造的细节与工厂分离了,这样产品的实现细节就被封装起来了,并且产品的可扩展性也很强.那么,这种设计模式我们称为工厂方法模式.具体的实例有很多,比如说去年的某一阵子脸萌软件爆红,其中就运用到了工厂方法模式来给用户生产各种脸型. 工厂方法模式分类