`
yuanlanxiaup
  • 浏览: 858449 次
文章分类
社区版块
存档分类
最新评论

工厂模式解析

 
阅读更多

Factory Method

Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 341.25pt; HEIGHT: 191.25pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/Sarkuya/LOCALS~1/Temp/msohtml1/01/clip_image001.png"></imagedata></shape>

Factory method

public interface Creator {

public void factoryMethod();

public void anOperation();

}

public class ConcreteCreator implements Creator {

public void factoryMethod() {

return new ConcreteProduct();

}

}

Client端的使用:

List 1

Creator factory = new ConcreteCreator();

Product product = factory.factoryMethod();

解析:

Ø 不使用设计模式时,代码如下:

Product product = new ConcreteProduct(); // A

ConcreateProduct product = new ConcreteProduct(); // B

Ø A直接违反了依赖倒转原则product将依赖于具体的ConcreteProduct类。更有甚者,B直接产生了一个具体产品,造成以后使用此product的对象也不得不依赖于具体的ConcreteProduct类。这是非常容易被疏忽的地方。

Ø 此模式体现了一个模式思想:将可变因素封装起来,并向外界提供一个不变的接口。上例中,所有的可变因素都抽象、封装到一个Creator的接口中,而Product的产生只依赖于此接口的factoryMethod()方法。

Ø List 1中,我们的目标是对于任何一个实现了Product接口的 product,应当都由实现了Creator接口的factory来自动产生,其代码应恒为:

Product product = factory.factoryMethod()

这样,即使以后出了新的产品,这条语句都不会改变。这正是-闭原则的具体实现。而要做到这一点,我们必须使用

Creator factory = new ConcreteCreator();

的语句。这就出现了一个硬编码的new语句,而且new的后面直接绑定了一个具体的ConcreteCreator类,在以后出现新的product后,还得必须在此处修改这个相应的ConcreteCreator类,是否违反了-闭原则

Ø 是的,部分违反了-闭原则。对“软件应当对扩展开放”来讲,它做到了,但违反了“对修改关闭”。这是因为,在Java中,任何对象都必须通过new来创建,而且不能通过new来创建接口或抽象类,即使运用了各种设计模式之后依旧不可避免。因此,对new ConcreteCreator(),我们做不了其他文章。但别忘了,我们的目标是要得到一个Product,而不是一个ConcreteCreator,这个ConcreteCreator对象是为了帮助我们灵活地获得Product而额外增加的对象。

Ø 这种方式让我们获得几个好处:一是Product product = factory.factoryMethod()的目标代码不会改变;二是在生成具体的ConcreteCreator时,我们并未立即生成Product,只有在调用factory.factoryMethod()的方法后才产生Product。这种解耦是我们借以实现Product product = factory.factoryMethod()的重要保障;三是Creator factory = new ConcreteCreator();体现了里氏替换原则:任何基类可以出现的地方,子类一定可以出现。通过这种替换,我们做到了灵活与不变相统一:我们可以指定不同的工厂,却可以使用相同的代码生成不同的产品。四是对于Creator factory来讲,由于它不负责生成具体的产品,因此它没必要“知道”Client需要得到什么要的产品,以及应该如何生成这种产品。它把这项工作交给实现了其接口的ConcreteCreator来完成,从而保证了该类的纯洁性与粗颗粒度。五是我们可以把具体工厂的类或实例,甚至是相应的字符串以参数的形式传入实现了Creaotr接口的某个类,让其自己指派具体的工厂类,从而将ConcreteCreator这个可变的因素再次封装起来。

Ø 这是一种典型的delegation:委派他人完成细节工作,自己大可不必事事躬亲。自己不瞎忙,还可让他人人尽其才,物尽其用。

分享到:
评论

相关推荐

    设计模式之一 3种工厂模式解析源码

    对简单工厂与复杂工厂不熟悉的后者什么时候用,有很大的帮助

    XML解析器-简单工厂模式.doc

    XML解析器-简单工厂模式.doc XML解析器-简单工厂模式.doc

    工厂模式详解

    工厂模式代码详解 包括反射 properties文件

    Android源码设计模式解析与实战

    主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、...

    android源码设计模式解析与实战.pdf下载 完整版高清

    本书从Android源码的角度由浅入深地剖析设计模式的运用,让工程师们把设计与模式重视起来,提升自己的设计能力与代码质量。因此本书适合的读者为初、中、高级Android工程师。另外,设计思想都是相通的,其他领域的...

    Android源码设计模式解析与实战PDF

    主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、...

    java之设计模式--各种设计模式解析

    java 设计模式 单例模式 工厂模式 命令模式 模式解析 各种模式的最全面的解析 最朴实的话语

    Java设计者模式简单工厂模式解析

    主要介绍了Java设计者模式简单工厂模式解析,介绍了其简介,实例以及优缺点分析,具有一定参考价值,需要的朋友可以了解下。

    设计模式逐个实例解析

    策略模式、工厂模式、代理模式、单例模式、迭代器模式、访问者模式、观察者模式...

    Android 源码设计模式解析与实战

    本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器...

    《Android 源码设计模式解析与实战》

    主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、...

    Android_源码设计模式解析与实战_ epub

    本书从Android源码的角度由浅入深地剖析设计模式的运用,让工程师们把设计与模式重视起来,提升自己的设计能力与代码质量

    设计模式解析(第二版)

    本书适用于软件开发专业人士,以及计算机专业、软件工程专业的高校师生,也可作为面向对象分析与设计课程的教材。 本书是最简洁、清晰、实用的设计模式著作,应用最新的Java示例,为程序员和架构师提供了使用模式...

    设计模式解析-英文

    设计模式解析(第2版)》以作者自身学习、使用模式和多年来为软件开发人员(包括面向对象技术老兵和新手)讲授模式的经验为基础撰写而成。首先概述了模式的基础知识,以及面向对象分析和设计在当代软件开发中的重要性,...

    设计模式解析(第二版).part2

     本书适合软件开发专业人士,以及计算机专业、软件工程专业的高校师生阅读,也可作为面向对象分析与设计课程的参考教材。  本书是最简洁、清晰、实用的设计模式著作,应用最新的Java示例,为程序员和架构师提供了...

    设计模式之简单工厂模式源码

    这是设计模式中简单工厂设计模式的源代码,工程中以一个计算器的示例来体现简单工厂模式的精髓。简单工厂模式主要解决创建对象的问题。

    设计模式解析(第二版).中文版.PDF格式 (2/2)

    本书适用于软件开发专业人士,以及计算机专业、软件工程专业的高校师生,也可作为面向对象分析与设计课程的教材。 本书是最简洁、清晰、实用的设计模式著作,应用最新的Java示例,为程序员和架构师提供了使用模式...

    C#设计模式:抽象工厂实例解析.7z

    C#设计模式:抽象工厂实例解析.7zC#设计模式:抽象工厂实例解析.7z

Global site tag (gtag.js) - Google Analytics