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

转载 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();
    }
}
复制代码

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

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

23种设计模式----创建型模式(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式)

1.单例模式  单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自己实例化并向整个系统提供这个实例。   通用类图如下:      通用代码如下:public cl...
  • oChangWen
  • oChangWen
  • 2017年06月17日 21:37
  • 441

抽象工厂模式,工厂方法模式区别

抽象工厂模式 转载自:https://www.shiyanlou.com/courses/document/867 一、本节目标我们本节课程主要介绍【抽象工厂模式】的相关知识,将会涉及以下内容: ...
  • u011532367
  • u011532367
  • 2015年11月29日 12:50
  • 1283

设计模式——抽象工厂模式及在jdk中的应用+几种工厂模式的比较

抽象工厂模式(Abstract Factory) 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问...
  • qqqqq1993qqqqq
  • qqqqq1993qqqqq
  • 2017年08月17日 16:39
  • 364

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

工厂方法模式 与简单工厂模式不同的是,简单工厂模式是工厂自己去实现对所有产品的构造的过程。根据不同的指令去生产对应的产品。但是,如果需求有变更,有新的产品需要去生产,或者有旧的产品不必去生产,都需要去...
  • DucklikeJAVA
  • DucklikeJAVA
  • 2016年03月25日 21:45
  • 523

【java设计模式】之 抽象工厂(Abstract Factory)模式

1. 女娲的失误         上一节学习了工厂模式,女娲运用了该模式成功创建了三个人种,可是问题来了,她发现没有性别……这失误也忒大了点吧……竟然没有性别,那岂不是……无奈,只好抹掉重来了,于是所...
  • eson_15
  • eson_15
  • 2016年04月26日 23:49
  • 11610

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

设计模式之禅- 抽象工厂模式
  • sunpeng19960715
  • sunpeng19960715
  • 2016年07月28日 23:13
  • 221

Java设计模式菜鸟系列(四)工厂方法模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method)分为三种: 一、普通工厂模式。...
  • JAVE_LOVER
  • JAVE_LOVER
  • 2014年10月04日 22:29
  • 2594

Java设计模式之工厂方法模式【Factory Method Pattern】

工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的...
  • Lixuanshengchao
  • Lixuanshengchao
  • 2016年05月04日 21:27
  • 959

大话设计模式—桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。主要解决:在有多种可能会变化的情况下,...
  • lmb55
  • lmb55
  • 2016年04月02日 15:27
  • 1557
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之工厂方法模式与抽象工厂模式
举报原因:
原因补充:

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