设计模式

单利模式

Singleton 模式主要作用是保证在 Java 应用程序中,一个类 Class 只有一个实例存在。 一般 Singleton 模式通常有几种种形式

第一种形式

定义一个类,它的 构造函数为 private 的,它 有一个 static 的 private 的该类变量,在 类初始化时实例话,通过一个 public 的 getInstance 方法获取对它的 引用,继而调用其中的方法。

public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪? 
//注意这是 private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本 class 的静态方法,可以直接访问 
public static Singleton getInstance() {
return instance;
}

}

第二种形式

public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() { 
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 
//使用时生成实例,提高了效率!
if (instance==null){
instance=new Singleton();   }
return instance; }
}

其他形式

定义一个类,它的构造函数为 private 的,所有方法为 static 的。一般认为第一种形式要更加安全些

  • spring 单例模式和非单例模式测试




package test;

import java.util.Date;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.opensymphony.xwork2.ActionContext;

public class TestScope {


    public static void main(String[] args) {
       ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-web.xml");

       Date s1=(Date)context.getBean("singleton");
       Date p1=(Date)context.getBean("prototype");

       Date s2=(Date)context.getBean("singleton");
       Date p2=(Date)context.getBean("prototype");


       System.out.println("单例:"+(s1==s2));
       System.out.println("非单例:"+(p1==p2));
    }

}

结果

  单例:true
  非单例:false

装饰器模式和代理模式

装饰器模式和代理模式之间还是有很多差别的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。

代理模式

public class Proxy implements Subject{

       private Subject subject;
       public Proxy(){
             //关系在编译时确定
            subject = new RealSubject();
       }
       public void doAction(){
             ….
             subject.doAction();
             ….
       }
}

//代理的客户
public class Client{
        public static void main(String[] args){
             //客户不知道代理委托了另一个对象
             Subject subject = new Proxy();
             …
        }
}

装饰器模式

public class Decorator implements Component{
        private Component component;
        public Decorator(Component component){
            this.component = component
        }
       public void operation(){
            …
            component.operation();
            …
       }
}

//装饰器的客户
public class Client{
        public static void main(String[] args){
            //客户指定了装饰者需要装饰的是哪一个类
            Component component = new Decorator(new ConcreteComponent());
            …
        }
}

推荐阅读23种设计模式

你可能感兴趣的:(设计模式)