设计模式1#单例
来源:互联网 发布:东快傻 知乎 编辑:程序博客网 时间:2024/06/05 11:15
单例
解决:保证了一个类在内存中只能有一个对象。
思路:1、如果其他程序能够随意用new创建该类对象,那么就无法控制个数。因此,不让其他程序用new创建该类的对象。
2、既然不让其他程序new该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了。
3、该类将创建的对象对外(整个系统)提供,让其他程序获取并使用。
步骤:
1、将该类中的构造函数私有化。
2、在本类中创建一个本类对象。
3、定义一个方法,返回值类型是本类类型。让其他程序通过该方法就可以获取到该类对象。
单例有两种:
1饿汉式:
class Single{private static final Single s = new Single();private Single(){ }public static Single getInstance(){ return s;}}2懒汉式:
class Single2 {private static Single2 s = null;private Single2(){ }public static synchronized Single2 getInstance() {//为了保证线程安全,加锁if(s==null)s=new Single2();return s;}}这里我给出两个例子来立理解如何使用单例的饿汉式和懒汉式:
饿汉式演示代码:
Single类:
package cn.hncu.pattern.singleton.one;/** * @author 军街 *饿汉式 */public class Single {private static final Single s=new Single();private Single(){}public static Single getInstance(){return s;}}mian类:
package cn.hncu.pattern.singleton.one;public class TestSingle {public static void main(String[] args) {Single s1=Single.getInstance();Single s2=Single.getInstance();System.out.println(s1==s2);}}懒汉式演示代码:
Single类:
package cn.hncu.pattern.singleton.two;/** * @author 军街 *懒汉式 */public class Single {private static Single s=null;private Single(){}public static synchronized Single getInstance(){if(s==null){s=new Single();}return s;}}
main类:
package cn.hncu.pattern.singleton.two;/* * 这里要注意的是,懒汉式如果多线程下有概率第一次被同时访问,就会可能new多个。所以要加锁防护。 * */public class TestSingle extends Thread{public static void main(String[] args) {TestSingle ts[]=new TestSingle[50]; for (int i = 0; i < ts.length; i++) {ts[i]=new TestSingle();}for (int i = 0; i <ts.length; i++) {ts[i].start();}}@Overridepublic void run() {Single s=Single.getInstance();System.out.println(s);}}
通过这两个例子我们明显可以看出我们控制了每次new的对象只有第一个是真正的new出来的,其他的和第一个内存地址相等。如下图所示:
0 0
- 模式设计1--单例设计模式
- 【设计模式】## 1、单例设计模式 ##
- 设计模式1#单例
- 【笔记】设计模式 - 1 单例模式
- 设计模式(四)--单例模式(1)
- 设计模式(1)-单例模式
- 设计模式1-单例模式
- 设计模式(1) 单例模式
- 设计模式(1):单例模式
- 设计模式(1)---->单例模式
- 自学设计模式--1 单例模式
- 设计模式1 单例模式
- 设计模式(1):单例模式
- 设计模式(1):单例模式
- Java设计模式-1-单例模式
- 设计模式1--单例模式
- C#设计模式(1)单例模式
- 设计模式1-单例模式
- 针对最近笔试的一些排序算法总结(未完待续)
- 无法新建scala文件
- C++11并发API总结
- 一道有趣的数学题
- Java泛型总结
- 设计模式1#单例
- TTT
- 理解数学空间,从距离到希尔伯特空间
- tecent 实习
- HDU-4961 Boring Sum (模拟)
- 一个服务端,电脑网页端登录和安卓端登录遇到的一些问题
- Java Lock-同步的另一种实现
- UVA 10537(最短路)
- (第7讲)java基本数据类型转换