知识大全 爪哇语言工厂方法创立性模式介绍(下)
Posted 工厂
篇首语:曲直都是经历,好坏都有风景。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 爪哇语言工厂方法创立性模式介绍(下)相关的知识,希望对你有一定的参考价值。
package javapatterns factorymethod; public class BadPlantException extends Exception public BadPlantException(String msg) super(msg); 代码清单 例外类 BadPlantException 工厂方法模式应该在什么情况下使用 既然工厂方法模式与简单工厂模式的区别很是微妙 那么应该在什么情况下使用工厂方法模式 又应该在什么情况下使用简单工厂模式呢? 一般来说 如果你的系统不能事先确定那一个产品类在哪一个时刻被实例化 从而需要将实例化的细节局域化 并封装起来以分割实例化及使用实例的责任时 你就需要考虑使用某一种形式的工厂模式 在我们的小花果园系统里 我们必须假设水果的种类随时都有可能变化 我们必须能够在引入新的水果品种时 能够很少改动程序 就可以适应变化以后的情况 因此 我们显然需要某一种形式的工厂模式 如果在发现系统只用一个产品类等级(hierarchy)就可以描述所有已有的产品类 以及可预见的未来可能引进的产品类时 简单工厂模式是很好的解决方案 因为一个单一产品类等级只需要一个单一的实的工厂类 然而 当发现系统只用一个产品类等级不足以描述所有的产品类 包括以后可能要添加的新的产品类时 就应当考虑采用工厂方法模式 由于工厂方法模式可以容许多个实的工厂类 以每一个工厂类负责每一个产品类等级 因此这种模式可以容纳所有的产品等级 在我们的小花果园系统里 不只有水果种类的植物 而且有蔬菜种类的植物 换言之 存在不止一个产品类等级 而且产品类等级的数目也随时都有可能变化 因此 简单工厂模式不能满足需要 为解决向题 我们显然需要工厂方法模式 关于模式的实现 在实现工厂方法模式时 有下面一些值得讨论的地方 第一丶在图四的类图定义中 可以对抽象工厂(Creator) 做一些变通 变通的种类有 抽象工厂(Creator) 不是接口而是抽象类 一般而言 抽象类不提供一个缺省的工厂方法 这样可以有效地解决怎样实例化事先不能预知的类的问题 抽象工厂(Creator) 本身是一个实类 并提供一个缺省的工厂方法 这样当最初的设计者所预见的实例化不能满足需要时 后来的设计人员就可以用实工厂类的factory() 方法来置换(Override))父类中factory()方法 第二丶在经典的工厂方法模式中 factory()方法是没有参量的 在本文举例时加入了参量 这实际上也是一种变通 第三丶在给相关的类和方法取名字时 应当注意让别人一看即知你是在使用工厂模式 技术架构中的工厂方法模式 在微软(Microsoft)所提倡的(Component Object Model)技术架构中 工厂方法模式起著关键的作用 在架框里 Creator接口的角色是由一个叫作IClassFactory的接口来担任的 而实类ConcreteCreator的角色是由实现IClassFactory接口的类CFactory(见下图)来担任的 一般而言 对象的创立可能要求分配系统资源 要求在不同的对象之间进行协调等等 因为IClassFactory的引进 所有这些在对象的创立过程中出现的细节问题 都可以封装在一个实现IClassFactory接口的实的工厂类里面 这样一来 一个架构的支持系统只需要创立这个工厂类CFactory的实例就可以了 图 微软(Microsoft)的(Component Object Model)技术架构是怎样工作的 在上面的序列活动(Sequence Activity)图中 用户端调用的库函数CoCreateInstance CoCreateInstance在架框中以CoGetClassObject实现 CoCreateInstance会在视窗系统的Registry里搜寻所要的部件(在我们的例子中即CEmployee) 如果找到了这个部件 就会加载支持此部件的DLL 当此DLL加载成功后 CoGetClassObject就会调用DllGetClassObject 后者使用new操作符将工厂类CFactory实例化 下面 DllGetClassObject会向工厂类CFactory搜询IClassFactory接口 返还给CoCreateInstance CoCreateInstance接下来利用IClassFactory接口调用CreateInstance函数 此时 IClassFactory::CreateInstance调用new操作符来创立所要的部件(CEmployee) 此外 它搜询IEmployee接口 在拿到接口的指针后 CoCreateInstance释放掉工厂类并把接口的指针返还给客户端 客户端现在就可以利用这个接口调用此部件中的方法了 EJB技术架构中的工厂方法模式 升阳(Sun Microsystem)倡导的EJB(Enterprise Java Beans)技术架构是一套为爪哇语言设计的 用来开发企业规模应用程序的组件模型 我们来举例看一看EJB架构是怎样利用工厂方法模式的 请考察下面的序列活动图 图 在升阳所提倡的EJB技术架构中 工厂方法模式也起著关键的作用 在上面的图中 用户端创立一个新的 Context 对象 以便利用 JNDI 伺服器寻找 EJBObject 在得到这个 Context 对象后 就可以使用 JNDI 名 比如 Employee 来拿到 EJB 类 Employee 的 Home 接口 使用 Employee 的 Home 接口 客户端可以创立 EJB 对象 比如 EJB 类 Employee 的实例 emp 然后调用 Employee 的各个方法 // 取到 JNDI naming context Context ctx = new InitialContext (); // 利用ctx 索取 EJB Home 接口 EmployeeHome home = (EmployeeHome)ctx lookup( Employee ); // 利用Home 接口创立一个 Session Bean 对象 // 这里使用的是标准的工厂方法模式 Employee emp = home create ( John Smith ); // 调用方法 emp setTel ( ); 代码清单 EJB架构中 Home接口提供工厂方法以便用户端可以动态地创立EJB类Employee的实例 JMS技术架构中的工厂方法模式 JMS定义了一套标准的API 让爪哇语言程序能通过支持JMS标准的MOM(Message Oriented Middleware 面向消息的中间伺服器)来创立和交换消息(message) 我们来举例看一看JMS(Java Messaging Service)技术架构是怎样使用工厂方法模式的 图 在JMS技术架构中 工厂方法模式无处不在 在上面的序列图中 用户端创立一个新的 Context 对象 以便利用 JNDI 伺服器寻找 Topic 和 ConnectionFactory 对象 在得到这个 ConnectionFactory 对象后 就可以利用 Connection 创立 Session 的实例 有了 Session 的实例后 就可以利用 Session 创立 TopicPublisher的实例 并利用Session创立消息实例 Properties prop = new Properties(); prop put(Context INITIAL_CONTEXT_FACTORY sun jndi fscontext RefFSContextFactory ); prop put(Context PROVIDER_URL file:C:\\temp ); // 取到 JNDI context Context ctx = new InitialContext(prop); // 利用ctx 索取工厂类的实例 Topic topic = (Topic) ctx lookup( myTopic ); TopicConnectionFactory tcf = (TopicConnectionFactory) ctx lookup( myTCF ); // 利用工厂类创立Connection 这是典型的工厂模式 TopicConnection tCon = tcf createTopicConnectoin(); // 利用Connection创立Session的实例 又是工厂模式 TopicSession tSess = tCon createTopicSession(false Session AUTO_ACKNOWLEDGE); // 利用Session创立Producer的实例 又是工厂模式 TopicPublisher publisher = tSess createPublisher(topic); // 利用Session创立消息实例 又是工厂模式 TextMesage msg = tSess createTextMessage( Hello from Jeff ); //发送消息 publisher publish(msg); 代码清单 JMS架构中 工厂模式被用于创立 Connection Session Producer 的实例 问答题 第 题 在这一节和上一节的类图中 我注意到Apple类的类图与Strawberry类的类图有一点点不同 在Apple类的类图左上角有一个夹子样的标识 请问这个标识代表什么意思 第 题 在这一节的类图 中 我注意到 ConcreteProduct 类只出现一次 但实现 Product 接口的类实际上可以有很多 这是否可以用在联接 Product 和 ConcreteProduct 之间的线旁注上 表示呢? 记得我在UML图中曾见过这种记号 第 题 请问在本节的小花果园系统的源代码清单 里 Broccoli 类实现两个接口 VeggieIF 和 PlantIF 只有 PlantIF 才与工厂模式有关 为什么不把 VeggieIF 接口合并到 PlantIF 接口中去? 第 题 请问在工厂方法模式中 产品(Product) 何时应是抽象类 何时应是接口? 第 题 请问在工厂方法 (factory())中 为什么要使用 if 语句作过程性判断来决定创立哪一个产品类 而不使用多形性原则 (Polymorphsm) 来创立产品类? 问答题答案 第 题 Apple类有性质(property) 而Strawberry类没有性质 一个类的成员变量叫做属性(attribute) 性质与属性的区别在于性质是带着一套取值丶赋值方法的属性 一个类有了属性 其类图左上角就会有一只夹子 有些人认为 一个爪哇类有了属性才能被称做爪哇豆(Java Bean) 这只夹子就表示这个类是一只豆 一个企业爪哇豆 或 EJB (Enterprise JavaBean) 的类图左上角也会有一只夹子 夹子上面有一个E字以示与普通的爪哇豆的不同(请见下图) 第 题 不能 在图 中联接 Product 和 ConcreteProduct 之间的线有两条 一条表示两者之间的推广关系 (即有向上箭头的) 另一条表示两者之间 cha138/Article/program/Java/gj/201311/27447相关参考
正如同笔者在一节里介绍的工厂模式有简单工厂模式工厂方法模式和抽象工厂模式几种形态简单工厂模式已经在前面作过介绍在简单工厂模式中一个工厂类处于对产品类实例化调用的中心位置上它决定那一个产品类应当被实
登记式单态类 登记式单态类是GoF为了克服饿汉式单态类及懒汉式式单态类均不可继承的缺点而设计的作者把他们的例子翻译为爪哇语言并将它自己实例化的方式从懒汉式改为饿汉式只是它的子类实例化的方式只能是
抽象类WindowAdapter是变压器模式的一个例子 抽象类WindowAdapter是为接受视窗的事件而准备的此抽象类内所有的方法都是空的使用此类可以很方便地创立listener对象置换(O
简单地说观察者模式定义了一个一对多的依赖关系让一个或多个观察者对象监察一个主题对象这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象使这些观察者对象能够自动更新 观察者模式
什么是结构性模式 结构性模式描述类和对象怎样结合在一起成为较大的结构结构性模式描述两种不同的东西类与类的实例根据它们所描述的东西的不同结构性模式可以分为类结构模式和实例结构模式两种 类结构模式
用Delphi语言来学设计模式之简单工厂篇 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 
知识大全 JavaScript模式之工厂模式(Factory)应用介绍
JavaScript模式之工厂模式(Factory)应用介绍 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
在“斯大林模式”下,全国是一个统一的“大工厂”,而企业只是这座“大工厂”中的一个“生产车间”……甚至“每一双皮鞋或每一件
在“斯大林模式”下,全国是一个统一的“大工厂”,而企业只是这座“大工厂”中的一个“生产车间”……甚至“每一双皮鞋或每一件内衣,都要由中央调配”。这表明“斯大林模式”_____。A、实行指导性的计划管理
C#设计模式编程之抽象工厂模式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 抽象工厂(Abst
实现Java抽象工厂模式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 了解模式需要研究客户端程