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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一个设计模式-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

以上是关于每天一个设计模式-5 工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

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

每天学设计模式:简单工厂模式

设计模式工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

「每天一个知识点」精讲设计模式面试专题

设计模式-----抽象工厂模式

设计模式之工厂模式