设计模式之工厂方法模式与抽象工厂模式

在上一篇关于设计模式的博客:http://www.cnblogs.com/shenliang123/archive/2012/05/10/2494412.html  已经说到了这个问题:就是如何让工厂类来更好的处理不同实例的返回即使用另外一种思路来代替在一个工厂类中进行逻辑判断以返回不同的对象实例;

解决的方案就是今天要介绍的:工厂方法模式与抽象工厂模式

该设计模式的设计:就是提供多个工厂类,有多少个实现类就提供多少个工厂类;依照前面的思路,我们这里又需要面向接口进行编写了;

还是上次那个Print实例:

首先上次那个例子中有两个实现类分别是:ExcelImpl与WordImpl;因此安装工厂方法的设计模式,我们需要提供两个工厂类;

按照面向接口编程:我们需要首先为所有的工厂类提供一个接口:

PrintFactoryInterface:

package xidian.sl.interfaces;

public interface PrintFactoryInterface {
    public Print getPrint();
}

然后是两个实现类:ExcelFactory

package xidian.sl.impl;

import xidian.sl.interfaces.Print;
import xidian.sl.interfaces.PrintFactoryInterface;

public class ExcelFactory implements PrintFactoryInterface{

    @Override
    public Print getPrint() {
        // TODO Auto-generated method stub
        return new ExcelImpl();
    }

}

WordFactory:

package xidian.sl.impl;

import xidian.sl.interfaces.Print;
import xidian.sl.interfaces.PrintFactoryInterface;

public class WordFactory implements PrintFactoryInterface {

    @Override
    public Print getPrint() {
        // TODO Auto-generated method stub
        return new WordImpl();
    }

}

调用者代码:

package xidian.sl.impl;

import xidian.sl.interfaces.Print;
import xidian.sl.interfaces.PrintFactory;
import xidian.sl.interfaces.PrintFactoryInterface;

public class DataOutput {
    private Print print;
    
    public DataOutput(Print print){
        this.print = print;
    }
    /**
     * 模拟导出,这里就是需要调用其他对象中的方法进行实现
     * */
    public void output(){
        print.outPrint();
    }
    
    public static void main(String[] args){
        /**
         * 实例化工厂类
         * */
        //PrintFactory printFactory = new PrintFactory();
        PrintFactoryInterface printFactory = new ExcelFactory();
        /**
         * 实例化调用的类,通过构造方法来对DataOutput对象进行初始化
         * */
        DataOutput dataOutput = new DataOutput(printFactory.getPrint());
        dataOutput.output();
    }
}

看下上面的代码可以发现与简单工厂模式的区别是:现在调用者需要更改不同的实现类只需要更换PrintFactoryInterface printFactory = new ExcelFactory();来实例化不
同的工厂类即可,这样保证了每个工厂类只负责一个实例类,但这样却出现了另外一个问题就是工厂类与调用者的耦合;

抽象工厂模式就是用来解决工厂类与调用者之间耦合的问题:先直接来看对应的抽象工厂类的代码:

package xidian.sl.interfaces;

import xidian.sl.impl.ExcelFactory;
import xidian.sl.impl.WordFactory;

public class PrintFactoryFactory {
    /**
     * 下面只定义一个方法来返回相应的工厂类
     * */
    public static PrintFactoryInterface getFactory(String type){
        //equalsIgnoreCase进行比较时不会考虑大小写
        if("better".equalsIgnoreCase(type)){
            return new ExcelFactory();
        }else{
            return new WordFactory();
        }
    }

}

大家可能发现了这个抽象工厂类跟上一节中讲的工厂类很像,只是返回的对象不一样,抽象工厂类是管理工厂类的,返回的也是工厂类实例而工厂类是管理被调用实例的,故返回的
也是被调用实例;

调用代码变为:

package xidian.sl.impl;

import xidian.sl.interfaces.Print;
import xidian.sl.interfaces.PrintFactory;
import xidian.sl.interfaces.PrintFactoryFactory;
import xidian.sl.interfaces.PrintFactoryInterface;

public class DataOutput {
    private Print print;
    
    public DataOutput(Print print){
        this.print = print;
    }
    /**
     * 模拟导出,这里就是需要调用其他对象中的方法进行实现
     * */
    public void output(){
        print.outPrint();
    }
    
    public static void main(String[] args){
        /**
         * 实例化工厂类
         * */
        //PrintFactory printFactory = new PrintFactory();
        //PrintFactoryInterface printFactory = new ExcelFactory();
        PrintFactoryInterface printFactory = PrintFactoryFactory.getFactory("better");
        /**
         * 实例化调用的类,通过构造方法来对DataOutput对象进行初始化
         * */
        DataOutput dataOutput = new DataOutput(printFactory.getPrint());
        dataOutput.output();
    }
}

工厂模式就解析到此

 

 

 

 

 

posted on 2012-05-10 18:38  发表是最好的记忆  阅读(945)  评论(0编辑  收藏  举报