1. 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
2. 工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
3. 工厂方法模式可以用来允许系统在不修改具体工厂角色的情况下引进新的产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。
4. 工厂方法模式的简略类图:
5. 当一个产品的等级结构,由一个(甚至多个)抽象产品和多个具体产品组成时,我们常常采用的一个做法是按照产品的等级结构设计一个同结构的工厂等级结构,然后由相应的工厂角色创建相应的产品角色:
6. 工厂方法模式的结构示例:
a) 抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。这个角色常用抽象Java 类或Java接口实现。
b) 具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体Java 类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
c) 抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在实际系统中,这个角色常用抽象Java 类或Java接口实现。
d) 具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
7. 如果系统需要加入一个新的产品,那么所需要的就是向系统中加入一个这个产品类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的产品类而言,这个系统完全支持“开-闭”原则。
8. Java中的应用:
a) java.util.Collection 接口规定所有的Java Collection必须提供一个iterator()方法,返还一个Iterator 类型的对象。一个具体的Java Collection对象会通过这个iterator()方法接口返还一个具体的Iterator 类。可以看出,这个iterator()方法就是一个工厂方法。
b) java.util.List 接口给出了两个工厂方法,一个是iterator()方法,返还一个Iterator 类型的对象;另一个是listIterator()方法,返还一个ListIterator 类型的对象。
c) URL类提供一个叫做openConnection()的工厂方法,这个方法返还一个URLConnection 对象。而URLConnection 对象则代表一个与远程对象的连接。URLConnection 是所有的代表应用系统与一个URL 的连接对象的超类,使用URLConnection 对象可以针对一个URL 进行读写操作。
9. 工厂方法所返还的应当是抽象类型,而不是具体类型,只有这样才能保证针对产品的多态性。调用工厂方法的客户端可以针对抽象编程,依赖于一个抽象产品类型,而不是具体产品类型。如果工厂方法仅仅返还一个具体产品类型,就不再是工厂方法模式了。如果工厂等级结构中只有一个具体工厂类的话,那么抽象工厂角色也可以省略, 叫做退化的工厂方法模式。
10. 工厂方法模式总是涉及到两个等级结构中的对象,而这两个等级结构可以分别是MVC
模式中的控制器(Controller)和视图(View)。一个MVC 模式可以有多个控制器和多个视图:
11. EJB中的应用:
// 取到 JNDI naming context Context ctx = new InitialContext (); // 利用ctx 索取 EJB Home 接口 EmployeeHome home = (EmployeeHome)ctx.lookup("Employee"); // 利用Home 接口创建一个 Session Bean 对象 // 这里使用的是标准的工厂方法模式 Employee emp = home.create (1001, "John", "Smith"); // 调用方法 emp.setTel ("212-657-7879");
12. JMS中的应用:
Properties prop = new Properties(); prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.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);
相关推荐
软件体系结构与设计模式第十二章工厂方法模式 工厂方法模式是一种常用的设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。这种模式的主要作用是...
第13章 工厂方法\(Factory Method\)模式 第14章 抽象工厂\(Abstract Factory\)模式 第15章 单例\(Singleton\)模式 第16章 专题:单例模式与MX记录 第17章 专题:多例\(Multiton\)模式与多语言支持 第18章 专题...
第04章 精益求精:工厂方法模式 (FactoryMethod) 第05章 再接再厉:抽象工厂模式 (AbstractFactory) 第06章 孜孜不倦:创建者模式 (Builder) 第07章 照猫画虎:原型模式 (Prototype) 第08章 独一无二:单例模式 ...
第16章 工厂方法(factory method)模式 141 第17章 抽象工厂(abstract factory)模式 148 第18章 原型(prototype)模式 158 第19章 备忘录(memento)模式 163 第20章 操作型模式介绍 176 第21章 模板方法(template ...
Adapter模式 72 第8章 开拓视野 82 第9章 Strategy模式 98 第10章 Bridge模式 113 第11章 Abstract Factory模式 138 第12章 专家设计之道 154 第13章 用模式解决CAD/CAM问题 162 第五部分 迈向新的设计方式 第14章 ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...
工厂方法模式( Factory Method ) 抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( ...
第5章工厂方法模式(FACTORY METHOD PATTERN):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 第6章抽象工厂模式(ABSTRACT FACTORY PATTERN):提供一个创建一...
工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式...
第4章 工厂方法模式(Factory Method) 4.1 模式解说 4.2 结构和用法 4.2.1 模式结构 4.2.2 代码模板 4.2.3 问题讨论 4.3 范例与实践 4.3.1 利用工厂方法模式设计可动态切换持久层机制的应用 4.3.2 范例小结...
第4章 工厂方法模式(Factory Method) 4.1 模式解说 4.2 结构和用法 4.2.1 模式结构 4.2.2 代码模板 4.2.3 问题讨论 4.3 范例与实践 4.3.1 利用工厂方法模式设计可动态切换持久层机制的应用 4.3.2 ...