单例模式
2013-10-03 12:35
351 查看
大学里面设计模式放在大四才学,而大四大家都在外面实习,所以这样的课基本等于没上。
现在毕业了才回来补以前没学好的内容。
先来分析一下单例模式的特点:
1.该类只有一个实例
2.该类必须自行创建这个实例,而不能在外部创建
3.它必须向外暴露一个获取实例的方法
基于以上几个特点,下面一一分析。
1.该类只有一个实例,所以这个类不能通过普通的创建对象的方法new 来创建。也就是说它的构造函数必须是private,那么外部就无法访问了。
即:private Singleton(){},不可以是public,否则可以new Singleton();
2.该类必须自行创建自身的实例,所以必须在Singleton内部定义一个Singleton对象。必须为private,否则外部可以直接访问instance对象。
3.通过public static getInstance方法获得对象。getInstance方法为什么是静态的?因为不能通过new 来创建当前对象。instance为什么也是静态的?因为静态方法引用的对象必须是静态对象。
下面是Android项目实际开发过程中遇到的单例模式。这个是一个图片缓存类。
一个线程池不会反复去创建的,需要使用单例。getInstance中引用到的所有变量都是static的。
现在毕业了才回来补以前没学好的内容。
class Singleton { private static Singleton instance=null; private Singleton(){} public static Singleton getInstance() { if(instance==null) instance=new Singleton(); return instance; } }
先来分析一下单例模式的特点:
1.该类只有一个实例
2.该类必须自行创建这个实例,而不能在外部创建
3.它必须向外暴露一个获取实例的方法
基于以上几个特点,下面一一分析。
1.该类只有一个实例,所以这个类不能通过普通的创建对象的方法new 来创建。也就是说它的构造函数必须是private,那么外部就无法访问了。
即:private Singleton(){},不可以是public,否则可以new Singleton();
2.该类必须自行创建自身的实例,所以必须在Singleton内部定义一个Singleton对象。必须为private,否则外部可以直接访问instance对象。
3.通过public static getInstance方法获得对象。getInstance方法为什么是静态的?因为不能通过new 来创建当前对象。instance为什么也是静态的?因为静态方法引用的对象必须是静态对象。
下面是Android项目实际开发过程中遇到的单例模式。这个是一个图片缓存类。
一个线程池不会反复去创建的,需要使用单例。getInstance中引用到的所有变量都是static的。
class ImageCache { private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 128; private static final int KEEP_ALIVE = 10; private static final BlockingQueue<Runnable> sWorkQueue = new LinkedBlockingQueue<Runnable>(); private static ThreadPoolExecutor sExecutor; private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) { return new Thread(r, "MulDownLoadImage #" + mCount.getAndIncrement()); } }; private ImageCache() { } public static ImageCache getInstance() { if (imageCache == null) { imageCache = new ImageCache(); sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory, new ThreadPoolExecutor.DiscardOldestPolicy()); } return imageCache; } }
相关文章推荐
- Session Façade模式
- 修复无法进入安全模式
- 颜色模式转换 (RGB & HSB)
- 行为模式之四---Iterator
- WCF入门(三)——消息交换模式
- 浏览器中的渲染模式
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- 模式匹配
- IO 异常处理模式
- PHP设计模式系列 - 中介者模式
- QTP三种录制模式及模拟录制模式和低级录制模式的区别、规则
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常
- 保护模式下8259A芯片编程及中断处理探究(上)【2】
- Oracle归档模式与非归档模式设置
- Java 单例模式详解
- 共享内存和ie保护模式
- 查看oracle数据库是否为归档模式启动
- 设计模式一之策略模式(strategy)
- Java经典23种设计模式之行为型模式(四)
- URL vs. HTML 录制模式