看Jive 源代码,学习,领悟设计模式。
1. 工厂模式 : 客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
可以把需要生产的产品放置在配置文件里。这样修改比较简单。
public abstract class ForumFactory {
private static Object initLock = new Object();
private static String className = " com.Yasna.forum.database.DbForumFactory";
private static ForumFactory factory = null;
public static ForumFactory getInstance(Authorization authorization) {
if (authorization == null) {
return null;
}
//以下使用了Singleton 单态模式,将在2.3节讨论
if (factory == null) {
synchronized(initLock) {
if (factory == null) {
... //从配置文件中获得当前className
try {
//动态装载类
Class c = Class.forName(className);
factory = (ForumFactory)c.newInstance();
}
catch (Exception e) {
return null;
}
}
}
}
//返回 proxy.用来限制授权对forum的访问
return new ForumFactoryProxy(authorization, factory,factory.getPermissions(authorization));
}
ForumFactory 的工作由其子类DbForumFactory实现,以后如果不要数据库时只需继承ForumFactory 修改配置文件即可。这里用的时工厂方法模式。
2.单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。
为确保该类仅有一个实例,那么不能 new ,所以构造函数为private ,为了或得该类的一个实例,那么在类的内部必须生产出一个该类的静态实例,并且提供静态取得该实例的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪
//注意这是private,只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
这是比较常用的一种写法。
3.代理模式: 为其他对象提供一种代理以控制这个对象的访问。
板桥里人 说过: 使用代理模式,一是为了 授权代理,二是.某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动. 可能某个对象太大,每次载入内存都要浪费很大的内存,为节省内存,应该使用这种模式。
在Jive 中:
凡是涉及到对论坛名称修改这一事件,其他程序都首先得和ForumProxy打交道,由ForumProxy决定是否有权限做某一样事情,ForumProxy是个名副其实的"网关","安全代理系统".
Proxy还可以对用户隐藏另外一种称为copy-on-write的优化方式.拷贝一个庞大而复杂的对象是一个开销很大的操作,如果拷贝过程中,没有对原来的对象有所修改,那么这样的拷贝开销就没有必要.用代理延迟这一拷贝过程.
代理模式就有三个角色组成了:
1.抽象主题角色:声明了真实主题和代理主题的共同接口。
2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。
3.真实主题角色:定义真实的对象。