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

转载 2013年12月02日 12:01:48

在上一篇关于设计模式的博客: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();
    }
}
复制代码

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

1.定义:工厂方法模式属于创建类模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类 2.类图 3.结构:     工厂接口:工厂接口是工厂方法模式的...

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

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式。 通用类图如下:         在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;C...

设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一...

《HeadFirst设计模式》书摘-装饰者模式/抽象工厂模式/工厂方法模式

装饰者模式 定义 动态地将责任附加到对象上,想要扩展功能,装饰者提供有别于继承的另一种选择 get到的oo原则 对扩展开放,对修改关闭 要点 继承属于扩展形式之一,...

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

工厂方法模式(Factory Method) 工厂方法模式(Factory Method)是一种创建型的设计模式,在该模式中父类决定实例的生成方式。但是不决定它要生成的具体的类,具体的处理是交给子类...

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

设计模式之工厂方法模式工厂方法模式(Factory Method): 定义一个用于创建对象的接口,让子类决定去将哪一个类实例化。Factory Method是一个类的实例化延迟到其子类。 简单地说:工...

设计模式(Design Patterns)-可复用面向对象软件的基础 02:工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory)

工厂方法模式有三种: 1、普通工厂模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 首先,创建一个接口(Sender): public interface Sender{ publ...

设计模式——抽象工厂模式、工厂方法模式

抽象工厂模式  上篇说到简单工厂模式。简单工厂模式在运用中其实存在一定的局限性。比如,类对象在newInstance时默认调用的是该类的无参构造方法,而一个类多数情况下不止是一种构造方法,这带来了一定...

Java设计模式-工厂方法模式和抽象工厂模式

工厂方法模式定义: 即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。“一对一”的关系 1,一抽象工厂类派生出多个具体工厂类; 2,一抽象产品类派生...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之工厂方法模式与抽象工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)