- 浏览: 112000 次
- 性别:
- 来自: 成都
最近访客 更多访客>>
文章分类
最新评论
-
dev_liu:
lipengyu2006 写道现在怎么样儿了啊 房子多少钱买 ...
最近比较心烦 -
lipengyu2006:
现在怎么样儿了啊 房子多少钱买的。
最近比较心烦 -
cynan168:
...
hibernate数据查询的几种方式 -
My_Choice:
joram中文文档 -
My_Choice:
非常感谢,太有用了,中文文档不好找啊,而且是这么详细的
joram中文文档
定义:提供创建对象的接口.
为何使用?
工厂模式是我们最常用的模式了,著名的Jive 论坛系统,就大量使用了工厂模式.
为什么说工厂模式是最常用,因为工厂模式就相当于创建对象的new. 工厂模式就是用来创
建对象的.
比如我们有一个类Sample 我们要创建Sample 的对象:
Sample sample=new Sample();
如果我们要在创建sample 之前做点事情,比如,赋值等,可以使用Sample 的构造函数:
Sample sample=new Sample(参数);
如果创建sample 时做的事情不是如赋值这样简单的事,可能是很长一段代码,如果也写入构
造函数中,那明显的就违背了面向对象的原则.封装(Encapsulation)和分派(Delegation);
我们需要将创建实例的责任与使用实例的责任分开, 使得语句
Sample sample=new Sample(参数);
就是简单的责任:使用Sample 这个实例;至于创建Sample 的任务就交给了Factory 工厂模
式.
还有,如果Sample 有个继承如MySample, 按照面向接口编程,我们需要将Sample 抽象成一
个接口.
现在Sample 是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:
Sample mysample=new MySample();
Sample hissample=new HisSample();
随着项目的深入,Sample 可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个实
例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程
序中是无法避免的.
但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了.
你会建立一个专门生产Sample 实例的工厂:
public class Factory{
public static Sample creator(){
....
if (which==1)
return new MySample();
else if (which==2)
return new HisSample();
}
}
那么在你的程序中,如果要实例化MySample 时.就使用
Sample sample=Factory.creator();
这样,在整个就不涉及到Sample 的具体子类,达到封装效果,也就减少错误修改的机会,这个
原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作
的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们
从编程序中也能悟出人生道理?呵呵.
好了,言归正传,既然不可避免使用factory,那我们就认识一下工厂模式.
如何使用?
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).
上例中,我们使用的是简单的工厂方法. 这两个模式没有很明显的区别,区别在于需要创建
对象的复杂程度上。如果我们创建对象的方法变得复杂了,我们就可能要将上例中Factory
变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现:
public abstract class Factory{
public abstract Sample creator();
public abstract Sample2 creator();
}
public class SimpleFactory extends Factory{
public Sample creator(){
......
}
public Sample2 creator(){
......
}
}
public class BombFactory extends Factory{
public Sample creator(){
......
}
public Sample2 creator(){
......
}
}
上例中我们只有一类产品接口 Sample , 工厂方法和抽象工厂可以创建多个产品接口的实
例,比如Sample2 Sample3
FactoryMethod 往往只是创建单个的实例。Abstract Factory 创建一系列的实例组,这些实
例彼此相关。
举例1
下图是来自天极网" 阎宏"的 爪哇语言抽象工厂创立性模式介绍 中的抽象工厂图:
在这张图中, 有两类产品接口interface RAM 和interface CPU; 同时有两个创建方
法:MacProducer 和PCProducer,这两个创建方法中都有createCPU()和createRAM(),返回的
实例对象组是CPU 和RAM, 这是分别来自两类产品接口,表面彼此是相关的.因此它是抽象工
厂.
举例2
我们以Jive 的ForumFactory 为例:
public abstract class ForumFactory {
private static Object initLock = new Object();
private static String className =
"com.jivesoftware.forum.database.DbForumFactory";
private static ForumFactory factory = null;
public static ForumFactory getInstance(Authorization authorization) {
//If no valid authorization passed in, return null.
if (authorization == null) {
return null;
}
//以下使用了Singleton 单态模式
if (factory == null) {
synchronized(initLock) {
if (factory == null) {
......
try {
//动态转载类
Class c = Class.forName(className);
factory = (ForumFactory)c.newInstance();
}
catch (Exception e) {
return null;
}
}
}
}
//Now, 返回 proxy.用来限制授权对forum 的访问
return new ForumFactoryProxy(authorization, factory,
factory.getPermissions(authorization));
}
//真正创建forum 的方法由继承forumfactory 的子类去完成.
public abstract Forum createForum(String name, String description)
throws UnauthorizedException, ForumAlreadyExistsException;
....
}
因为现在的Jive 是通过数据库系统存放论坛帖子等内容数据,如果有人要扩展为纯粹的文
件系统存放的论坛帖子,这个工厂方法ForumFactory 就提供了提供动态接口:
private static String className =
"com.jivesoftware.forum.database.DbForumFactory";
你可以使用自己开发的创建forum 的方法代替
com.jivesoftware.forum.database.DbForumFactory 就可以.
在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton 单态模式,以及
proxy 模式,proxy 模式主要用来授权用户对forum 的访问,因为访问forum有两种人:一个是
注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统
的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果.
好了.经过上述简单描述,你对工厂模式应该有个简单的印象,如果你要钻研工厂模式,网络
上有很多英文资料,不过我觉得过分钻研也没有必要,主要是使用实践,实际使用中工厂模式
的变种很多,只要你知道这样一个大概思路,相信在实践中你会是工厂模式的设计创建高手!
为何使用?
工厂模式是我们最常用的模式了,著名的Jive 论坛系统,就大量使用了工厂模式.
为什么说工厂模式是最常用,因为工厂模式就相当于创建对象的new. 工厂模式就是用来创
建对象的.
比如我们有一个类Sample 我们要创建Sample 的对象:
Sample sample=new Sample();
如果我们要在创建sample 之前做点事情,比如,赋值等,可以使用Sample 的构造函数:
Sample sample=new Sample(参数);
如果创建sample 时做的事情不是如赋值这样简单的事,可能是很长一段代码,如果也写入构
造函数中,那明显的就违背了面向对象的原则.封装(Encapsulation)和分派(Delegation);
我们需要将创建实例的责任与使用实例的责任分开, 使得语句
Sample sample=new Sample(参数);
就是简单的责任:使用Sample 这个实例;至于创建Sample 的任务就交给了Factory 工厂模
式.
还有,如果Sample 有个继承如MySample, 按照面向接口编程,我们需要将Sample 抽象成一
个接口.
现在Sample 是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:
Sample mysample=new MySample();
Sample hissample=new HisSample();
随着项目的深入,Sample 可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个实
例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程
序中是无法避免的.
但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了.
你会建立一个专门生产Sample 实例的工厂:
public class Factory{
public static Sample creator(){
....
if (which==1)
return new MySample();
else if (which==2)
return new HisSample();
}
}
那么在你的程序中,如果要实例化MySample 时.就使用
Sample sample=Factory.creator();
这样,在整个就不涉及到Sample 的具体子类,达到封装效果,也就减少错误修改的机会,这个
原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作
的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们
从编程序中也能悟出人生道理?呵呵.
好了,言归正传,既然不可避免使用factory,那我们就认识一下工厂模式.
如何使用?
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).
上例中,我们使用的是简单的工厂方法. 这两个模式没有很明显的区别,区别在于需要创建
对象的复杂程度上。如果我们创建对象的方法变得复杂了,我们就可能要将上例中Factory
变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现:
public abstract class Factory{
public abstract Sample creator();
public abstract Sample2 creator();
}
public class SimpleFactory extends Factory{
public Sample creator(){
......
}
public Sample2 creator(){
......
}
}
public class BombFactory extends Factory{
public Sample creator(){
......
}
public Sample2 creator(){
......
}
}
上例中我们只有一类产品接口 Sample , 工厂方法和抽象工厂可以创建多个产品接口的实
例,比如Sample2 Sample3
FactoryMethod 往往只是创建单个的实例。Abstract Factory 创建一系列的实例组,这些实
例彼此相关。
举例1
下图是来自天极网" 阎宏"的 爪哇语言抽象工厂创立性模式介绍 中的抽象工厂图:
在这张图中, 有两类产品接口interface RAM 和interface CPU; 同时有两个创建方
法:MacProducer 和PCProducer,这两个创建方法中都有createCPU()和createRAM(),返回的
实例对象组是CPU 和RAM, 这是分别来自两类产品接口,表面彼此是相关的.因此它是抽象工
厂.
举例2
我们以Jive 的ForumFactory 为例:
public abstract class ForumFactory {
private static Object initLock = new Object();
private static String className =
"com.jivesoftware.forum.database.DbForumFactory";
private static ForumFactory factory = null;
public static ForumFactory getInstance(Authorization authorization) {
//If no valid authorization passed in, return null.
if (authorization == null) {
return null;
}
//以下使用了Singleton 单态模式
if (factory == null) {
synchronized(initLock) {
if (factory == null) {
......
try {
//动态转载类
Class c = Class.forName(className);
factory = (ForumFactory)c.newInstance();
}
catch (Exception e) {
return null;
}
}
}
}
//Now, 返回 proxy.用来限制授权对forum 的访问
return new ForumFactoryProxy(authorization, factory,
factory.getPermissions(authorization));
}
//真正创建forum 的方法由继承forumfactory 的子类去完成.
public abstract Forum createForum(String name, String description)
throws UnauthorizedException, ForumAlreadyExistsException;
....
}
因为现在的Jive 是通过数据库系统存放论坛帖子等内容数据,如果有人要扩展为纯粹的文
件系统存放的论坛帖子,这个工厂方法ForumFactory 就提供了提供动态接口:
private static String className =
"com.jivesoftware.forum.database.DbForumFactory";
你可以使用自己开发的创建forum 的方法代替
com.jivesoftware.forum.database.DbForumFactory 就可以.
在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton 单态模式,以及
proxy 模式,proxy 模式主要用来授权用户对forum 的访问,因为访问forum有两种人:一个是
注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统
的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果.
好了.经过上述简单描述,你对工厂模式应该有个简单的印象,如果你要钻研工厂模式,网络
上有很多英文资料,不过我觉得过分钻研也没有必要,主要是使用实践,实际使用中工厂模式
的变种很多,只要你知道这样一个大概思路,相信在实践中你会是工厂模式的设计创建高手!
发表评论
-
追MM与Java的23种设计模式[转]
2007-01-20 03:09 1184... -
设计模式之Visitor
2007-01-20 02:54 1114Visitor 定义 作用于某个对象群中各个对象的操作. 它 ... -
设计模式之Interpreter(解释器)
2007-01-20 02:53 1172Interpreter 定义: 定义语言的文法 ,并且建立一 ... -
设计模式之Mediator(中介者)
2007-01-20 02:53 1186Mediator 定义: 用一个中介对象来封装一系列关于对象 ... -
设计模式之Strategy(策略)
2007-01-20 02:51 1127Strategy 是属于设计模式中 对象行为型模式,主要是定 ... -
设计模式之State
2007-01-20 02:51 1081设计模式之State State 的 ... -
设计模式之Command
2007-01-20 02:49 1022Command 模式是最让我疑惑的一个模式,我在阅读了很多代 ... -
设计模式之Chain of Responsibility(职责链)
2007-01-20 02:47 1123Chain of Responsibility 定义 Cha ... -
设计模式之Observer
2007-01-20 02:46 1006Java 深入到一定程度,就 ... -
设计模式之Memento(备忘机制)
2007-01-20 02:45 1140Memento 定义: memento 是一个保存另外一个对 ... -
设计模式之Template
2007-01-20 02:41 848Template 定义: 定义一个操作中算法的骨架,将一些步 ... -
设计模式之Flyweight(享元)
2007-01-20 02:40 1020板桥里人 http://www.jdon.com 2002/ ... -
设计模式之Bridge
2007-01-20 02:39 956Bridge 定义 : 将抽象和行为划分开来,各自独立,但能 ... -
设计模式之Composite(组合)
2007-01-20 02:38 923Composite 定义: 将对象以树形结构组织起来,以达成 ... -
设计模式之Adapter(适配器)
2007-01-20 02:36 864定义: 将两个不兼容的 ... -
设计模式之Proxy(代理)
2007-01-20 02:35 1118理解并使用设计模式, ... -
设计模式之Facade(外观)
2007-01-20 02:34 843Facade 的定义: 为子系统中的一组接口提供一个一致的界 ... -
设计模式之Builder
2007-01-20 02:33 966Builder 模式定义: 将一个复杂对象的构建与它的表示分 ... -
设计模式之Singleton(单态)
2006-12-28 21:28 1064定义: Singleton 模式主要作用是保证在Java 应 ... -
设计模式之Prototype(原型)
2006-12-28 21:22 1223定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型 ...
相关推荐
在标题和描述中提到的《java设计模式之Factory借鉴.pdf》文档,主要阐述了工厂模式的核心概念和实际应用。工厂模式的主要目的是为了将对象的创建过程与使用对象的逻辑分离,从而提高代码的可维护性和可扩展性。传统...
"工厂方法"(Factory Method)是这些设计模式之一,属于创建型模式,它在C#编程中扮演着至关重要的角色。本教程由张建中教授,旨在深入解析C#中的工厂方法设计模式。 工厂方法模式是一种抽象工厂模式的变体,主要...
设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这...
设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计...
Java设计模式中的工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,使得客户端能够避免与具体的类绑定,而是通过工厂方法来获取所需的对象。工厂模式的核心思想是将对象的创建过程封装起来,以便在不修改...
Java中的工厂模式是一种重要的设计模式,它为创建对象提供了一个接口,使得对象的创建过程更加灵活,同时也将对象的创建和使用分离,提高了代码的可维护性和可扩展性。工厂模式是面向对象设计中的一种基础模式,它...
Java设计模式中的工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,使得子类可以决定实例化哪一个类。工厂模式的主要目的是将对象的创建过程封装起来,从而使得系统更具扩展性和灵活性。 为何使用工厂...
设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计...
创建模式:设计模式之Factory,设计模式之Prototype(原型),设计模式之Builder,设计模式之Singleton(单态). 结构模式:设计模式之Facade(外观),设计模式之Proxy(代理),设计模式之Adapter(适配器),设计模式之Composite...
这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...
设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new一样频繁. 设计模式之Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder模式就是将这两 种...
创建模式 设计模式之Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用new一样频繁....
设计模式之Factory -工厂模式 客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。 缺点是当产品修改时,工厂类也要做相应的修改。 追MM少不了请吃饭了,麦当劳...
还有“工厂模式”(Factory pattern),它是创建型设计模式之一,用于创建对象而不暴露创建逻辑给客户端,并且通过使用一个共同的接口来指向新创建的对象。这种模式在创建对象时提供了更高的灵活性和可扩展性。在...
C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)
在设计模式中,Abstract Factory模式是一种用来解决在不指定具体实现的情况下创建一系列相关或相互依赖对象的模式。在本文的上下文中,我们看到它被应用于一个奇幻RPG游戏的角色种族设计,每个种族(如人类、精灵)...
书中特别提到了“设计模式之Factory.chm”,这暗示了对工厂模式的深入探讨。工厂模式是一种创建型模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这样,工厂模式就可以使一个类的实例化延迟到其...