您的位置:首页 > 其它

设计模式之---单例模式

2016-12-27 00:00 246 查看
摘要: 设计模式之---单例模式

设计模式之---单例模式

单例模式1饿汉式:

public class Signleton {

// 步骤1.提供私有的构造方法
private Signleton() {

}

// 步骤2. 内部私有化
private static Signleton signleton = new Signleton();

// 步骤3. 提供外部方法方法(由于这个方法在这个对象里,所以还是需要new一个这个对象,所以我没在该方法前加static,这样使用该方法就不需要加new这个对象)
public static Signleton getSignleton() {

return signleton;
}
// 以上称为饿汉式单例模式,因为在静态属性类加载时,就被初始化放进内存了。

}

单例模式2懒汉式:

public class Signleton {

// 步骤1.提供私有的构造方法
private Signleton() {

}
// 步骤2. 内部私有化
private static Signleton signleton = null;

// 步骤3. 提供外部方法方法(由于这个方法在这个对象里,所以还是需要new一个这个对象,所以我没在该方法前加static,这样使用该方法就不需要加new这个对象)
public synchronized static Signleton getSignleton() {
//首次访问时才创建对象,所以称为懒汉式单例模式。
//注意会有线程安全问题(解决可以在getSignleton方法上加上synchronized)。
//synchronized来确保为该方法只有一个对象在调用,但会造成性能问题)
if (null == signleton) {
signleton = new Signleton();
}
return signleton;
}

}


测试

先写多线程的调用

public class MyThread extends Thread {

@Override
public void run() {

System.out.println(Signleton.getSignleton());
}
}

juit测试

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class TestSignleton {

@Before
public void before() {

}

@After
public void after() {

}

@Test
public void test1() {
Signleton signleton1 = Signleton.getSignleton();
Signleton signleton2 = Signleton.getSignleton();

System.out.println("signleton1: " + signleton1);
System.out.println("signleton2: " + signleton2);
}

@Test
public void testLazy() {
new MyThread().start();
new MyThread().start();
new MyThread().start();
new MyThread().start();
}
}


其实还看了别人的更多还有使用了内部类来实现的。还是记个笔记吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: