`
javalion
  • 浏览: 13674 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

工厂模式笔记

阅读更多

《Java与模式》之工厂模式学习

Facotry Pattern包括了三种形态

  1. Simple Factory
  2. Factory Method
  3. Abstract Factory

下面分别进行学习

Simple Factory

简单工厂模式往往是普通工厂模式的一个特例。简单工厂模式基本是用一个类来模拟工厂,通过该工厂类的静态方法返回具体的产品类,而这些产品又源自一个抽象的产品(当然,这儿可能会存在多种抽象产品,即有多种不同类型的产品,如蔬菜、瓜果等等),即静态工厂模式。书中提及了几个对象:水果以及具体的水果,园丁;园丁根据得到的参量来决定提取某种水果。如果存在多种抽象产品,必须考察抽象产品是由抽象类来实现还是用接口来表现了,如果具体产品之间拥有共同的商业逻辑,一般都应用抽象类来表现,否则应用接口来表现,在一个类型的等级结构中,将共同的部分尽量向上塑造。相应的,工厂也可以分为多个工厂,各自负责不同种类的产品即抽象类。

考虑一下,如果我们新增了一种产品,那么在我们的静态工厂类中就必须再加入返回该新增的产品类的方法,是需要修改这个工厂类的。这个到底应该如何才能不修改工厂类呢?或许我们的工厂类不应该同具体产品类来发生关联关系。

Factory Method

工厂方法模式是类的创建模式,定义一个创建工厂接口,将实际的创建工作推到子类工厂中。也就是原本的静态类变成了一个抽象类或接口,而将制造的任务交给底下的具体实现类来完成。工厂方法模式似乎同抽象工厂模式很类似,但或许引入产品族后可以做一下比较。

抽象产品A(具体产品A1, 具体产品A2),抽象工厂F可以只有一个具体工厂,实现生成A的抽象方法。即工厂方法模式是将注意集中在可抽象产品概念上(意即多个具体产品可抽象化)。

如果引入产品族的概念,即有多个抽象产品,那么就必须对应不同的抽象产品形成不同的抽象工厂层,这会打破工厂的独立性,乃至形成一个庞大的工厂族。自然工厂方法模式不能很好的解决这种问题。因为有了产品族的引入,自然就引入了抽象工厂模式。

Abstract Factory

 这里真正引入了产品族、工厂族的概念。在实际的开发中,我们所面对的产品是分等级的,库存管理系统尤为显现。抽象工厂模式为客户端提供一个接口,使客户端在不必指定产品的具体类型就可以创建多个产品对象。

产品族也就是好有多个抽象产品,其下可能还拥有抽象产品和具体产品。抽象工厂模式,首先抽象出所有产品族的生产方法:

java 代码
  1. public interface Creator {   
  2.    ProductA factoryA();   //返回产品ProductA   
  3.    ProductB factoryB();   //返回产品ProductB   
  4. }  

不难发现,这种抽象与抽象产品的种类有关,有多少种抽象产品,就应有多少种抽象工厂方法。具体的生产交给具体工厂去实现。

java 代码
  1. /**  
  2. 这是抽象工厂的一个具体实现,它只负责生产ProductA1和ProductB1两种具体产品  
  3. */  
  4. public class ConcreteCreator1 implements Creator {   
  5.    public ProductA factoryA() {   
  6.       return new ProductA1();   
  7.    }   
  8.   
  9.    public ProductB factoryB() {   
  10.       return new ProductB1();   
  11.    }   
  12. }  

可以清楚的发现,该具体工厂仅仅负责所有产品族的各1种产品。ProductA拥有ProductA1, ProductA2两种具体产品, ProductB拥有ProductB1, ProductB2两种具体产品,正因为有了产品族和"1", "2"这两种相对性,我们才能抽象出工厂接口来。可以很容易地写出ConcreteCreator2具体工厂来。

试想一下,如果我们给ProductB再增加2种甚至更多的产品的时候,是否我们需要增加2种或者更多的具体工厂类来实现抽象工厂呢?如果是,那么就会有多余的factoryA()方法被“空实现”。同样我们可以形成工厂族来避免这些问题。

假如我们已经实现了抽象工厂

Client想要某种或多种产品,我们通过抽象工厂提供给它一个接口;

工厂中增加已有抽象的具体产品,可以增加一个具体工厂而不需要去修改其它的设计;

工厂中要增加新的抽象层面的产品,新增一个抽象产品类,增加所需要的具体产品,那么抽象工厂层是否需要修改,这似乎就违背了不修改现有代码的初衷了。是,这很麻烦,因为你需要重新抽象,甚至要修改以前的代码。可以考虑用其它方法解决。

小结

简单工厂模式和工厂方法模式可以看作是抽象工厂模式特例,当我们把简单工厂模式中的实际工厂抽象出一个抽象工厂时,它就变成了一个工厂方法模式;当我们把工厂方法模式的产品等级变得更多一些,形成产品族的时候,它又能成为一个抽象工厂模式。

分享到:
评论
1 楼 javalion 2007-11-10  
总算修改好了。

相关推荐

    设计模式笔记

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。

    尚硅谷设计模式源码笔记课件.zip

    1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、...:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式...

    韩顺平_Java设计模式笔记.docx

    "韩顺平_Java设计模式笔记" 本资源摘要信息是对《韩顺平_Java设计模式笔记.docx》的总结和分析,该笔记涵盖了 Java 设计模式的基础知识、设计模式的七大原则、原型设计模式、解释器设计模式、单例设计模式等内容,...

    自己总结的设计模式笔记

    设计模式笔记 设计模式是软件开发中常用的解决方案,能够提高代码的灵活性、可维护性和可扩展性。以下是设计模式的七大原则和两种常用的创建型设计模式。 1. "开-闭"原则 "开-闭"原则是设计模式的核心原则,指...

    设计模式笔记(精版)

    以上只是设计模式笔记中的一部分内容,实际上每个模式都有其特定的适用场景和优缺点。理解并熟练运用这些模式,可以提高代码的可读性、可维护性和复用性,降低系统复杂度,提升软件设计的质量。在实际项目中,应根据...

    HeadFirst设计模式学习笔记

    设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于理解和维护。这份笔记涵盖了13个关键的设计模式,下面将对这些模式进行逐一解析。 1. **单例模式**:确保一个类...

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    设计模式学习笔记大全

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而提出的一套最佳实践。这些模式经过时间的验证,被广泛应用于各种软件开发中,以提高代码的可读性、可维护性和复用性。下面将详细探讨压缩包...

    根据《JAVA与设计模式》整理的笔记及示例代码

    Java是一种广泛使用的面向对象的编程语言,而设计模式则是软件工程中解决常见问题的经验总结,是程序员在实践中形成的最佳实践。这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心...

    《设计模式学习笔记》

    《设计模式学习笔记》主要探讨了GOF的23种设计模式以及类设计的基本原则,旨在帮助开发者理解和应用这些经过时间验证的成熟解决方案。设计模式是面向对象软件设计中的核心概念,它们为解决常见的设计问题提供了标准...

    设计模式学习笔记(一)--简单工厂模式源码

    在这个学习笔记中,我们将深入理解简单工厂模式的概念、工作原理以及如何在实际编程中应用。 简单工厂模式的核心思想是通过一个公共的工厂类来创建不同类型的对象。这个工厂类负责识别客户端请求的对象类型,并返回...

    HeadFirst 设计模式学习笔记1--策略模式Demo

    《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...

    23种设计模式学习笔记

    设计模式是软件工程中的一种通用解决方案,它是在特定上下文中解决常见问题的经验总结。这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的...

    韩顺平_java设计模式笔记

    例如,开闭原则在工厂模式中体现,通过修改工厂类来增加新的产品,而不修改已有代码。 解释器设计模式用于构建解析表达式的系统,例如Spring框架中的SpelExpressionParser就使用了这一模式,它能解析表达式并执行...

    模式识别笔记推论及其考前冲刺押题

    1. "模式笔记.pdf":这很可能是对整个模式识别课程的全面笔记,涵盖了基本理论、主要算法和实例分析,可能是教授或教材作者的总结,也可能来自于学生的学习整理。 2. "作业_chapter4_解答(1).pdf":这部分内容可能...

    java设计模式学习笔记

    ### Java设计模式学习笔记——外观模式(Facade Pattern) #### 概述 设计模式是软件工程领域中一种解决常见问题的可复用解决方案。在Java开发过程中,掌握设计模式能够帮助开发者更好地组织代码结构,提高代码的...

    23种设计模式学习笔记及源码

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,...

    设计模式读书笔记

    创建型设计模式关注的是对象的创建,如工厂方法、抽象工厂、建造者、原型和单例模式,它们分别处理不同程度的对象创建延迟和实例化过程。结构型模式则涉及如何组合类和对象,包括适配器、桥接、组合、装饰器、外观、...

Global site tag (gtag.js) - Google Analytics