学习 GoF 设计模式的重要性:
GoF 的设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用.
创建模式的人是大师,但是拘泥于模式的人永远是工匠.
设计模式之 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(){
......
}
}
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) {
设计模式(Patterns in Java) -- http://www.jdon.com
13
......
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,类似网关的概念,可以很好的达到这个效果.