设计模式 (一)

      看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.真实主题角色:定义真实的对象。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值