标签:
设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。
我一直以为设计模式很难,很高大上,从现在开始,我来浅谈对java23种设计模式的理解。
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
今天来阐述单例模式。
首先,什么是单例模式?
百度百科的定义:单例模式是一种常用的软件设计模式。在他的核心中只有一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。
简单点说,就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。
然后,单例模式有什么特点?
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
其次,单例模式有何作用?以及如何实现?
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态。
要想控制一个类只被创建一个实例,那么首要的问题就是要把创建实例的权限收回来,让类自身来负责自己类实例的创建工作,然后由这个类来提供外部可以访问这个类实例的方法,这就是单例模式的实现方式。
懒汉式与饿汉式的区分:
其实就是在具体创建对象实例的处理上,有不同的实现方式。
饿汉式、懒汉式其实是一种比较形象的称谓。
所谓懒汉式,既然是懒,那么在创建对象实例的时候就不着急,会一直等到马上要使用对象实例的时候才会创建,因此在装载对象的时候不创建对象实例,写法如下: private staticSingleton uniqueInstance = null; 而是等到第一次使用的时候,才去创建实例,也就是在getInstance方法里面去判断和创建。
所谓饿汉式,既然饿,那么在创建对象实例的时候就比较着急,饿了嘛,于是就在装载类的时候就创建对象实例,写法如下: privatestatic Singleton uniqueInstance = new Singleton();
下面以代码来演示:
Person类:
public class Person {
private String name;
public String getName() {
return name;
}
public voidsetName(String name) {
this.name = name;
}
// 该类只能有一个实例
private Person() {
} // 私有无参构造方法
// 该类必须自行创建
// 有2种方式
private static Person ts = new Person();
// private static Person ts1=null;
// 这个类必须自动向整个系统提供这个实例对象提供外部可以访问这个类实例的方法
public static PersongetInstance() {
if (ts == null) {
ts = new Person();
}
return ts;
}
}
Singleton类
/**
*懒汉式与饿汉式在区别
*/
public classSingleton{
//4:定义一个变量来存储创建好的类实例
//5:因为这个变量要在静态方法中使用,所以需要加上static修饰
private static Singletoninstance = null;
//1:私有化构造方法,便于在内部控制创建实例的数目
private Singleton(){}
//2:定义一个方法来为客户端提供类实例
//3:这个方法需要定义成类方法,也就是要加static
public static Singleton getInstance(){
//6:判断存储实例的变量是否有值
if(instance == null){
//6.1:如果没有,就创建一个类实例,并把值赋给存储类实例的变量
instance = newSingleton(); //饿汉式在创建这个实例的时候不会判断用不用,有没有,直接就在上面5处创建
}
//6.2:如果有值,那就直接使用
return instance;
}
}
其中这个类可以没有,这里只是说明一下懒汉式与饿汉式的区别。
测试类:
public class TestMain{
public static voidmain(String[] args){
Person s=Person.getInstance();
s.setName("张三");
System.out.println(s.getName());
Person s1=Person.getInstance();
s1.setName("李四");
System.out.println(s1.getName());
System.out.println( s +"\t"+ s1);
if(s==s1){
System.out.println("创建的是同一个实例");
}else if(s!=s1){
System.out.println("创建的不是同一个实例");
}else{
System.out.println("applicationerror");
}
}
}
如果把张三 李四那个实例化类去掉,则打印不同的地址。
我们还是回到单例模式
他们的输出地址还是一样的。
通过在IDE中测试一下,你是不是对单例模式有了一定的了解呢。
下一次,我要讲解内部类。
标签:
原文地址:http://blog.csdn.net/tanjunchen/article/details/51353780