1:单例模式的本质
单例模式的本质:控制实例数目。
单例模式是为了控制在运行期间,某些类的实例数目只能有一个。可能有人就会想了,那么我能不能控制
实例数目为2个,3个,或者是任意多个呢?目的都是一样的,节省资源啊,有些时候单个实例不能满足实际的
需要,会忙不过来,根据测算,3个实例刚刚好,也就是说,现在要控制实例数目为3个,怎么办呢?
其实思路很简单,就是利用上面通过Map来缓存实现单例的示例,进行变形,一个Map可以缓存任意多个
实例,新的问题就是,Map中有多个实例,但是客户端调用的时候,到底返回那一个实例呢,也就是实例的调
度问题,我们只是想要来展示设计模式,对于这个调度算法就不去深究了,做个最简单的,循环返回就好了,
示例代码如下:
/**
* 简单演示如何扩展单例模式,控制实例数目为3个
*/
public class OneExtend {
/**
* 定义一个缺省的key值的前缀
*/
private final static String DEFAULT_PREKEY = "Cache";
/**
* 缓存实例的容器
*/
private static Map<String,OneExtend> map =
new HashMap<String,OneExtend>();
/**
* 用来记录当前正在使用第几个实例,到了控制的最大数目,就返回从1开始
*/
private static int num = 1;
/**
* 定义控制实例的最大数目
*/
private final static int NUM_MAX = 3;
private OneExtend(){}
public static OneExtend getInstance(){
String key = DEFAULT_PREKEY+num;
//缓存的体现,通过控制缓存的数据多少来控制实例数目
OneExtend oneExtend = map.get(key);
if(oneExtend==null){
oneExtend = new OneExtend();
map.put(key, oneExtend);
}
//把当前实例的序号加1
num++;
if(num > NUM_MAX){
//如果实例的序号已经达到最大数目了,那就重复从1开始获取
num = 1;
}
return oneExtend;
}
public static void main(String[] args) {
//测试是否能满足功能要求
OneExtend t1 = getInstance ();
OneExtend t2 = getInstance ();
OneExtend t3 = getInstance ();
OneExtend t4 = getInstance ();
OneExtend t5 = getInstance ();
OneExtend t6 = getInstance ();
System.out.println("t1=="+t1);
System.out.println("t2=="+t2);
System.out.println("t3=="+t3);
System.out.println("t4=="+t4);
System.out.println("t5=="+t5);
System.out.println("t6=="+t6);
}
}
看一下测试结果
t1==cn.javass.dp.singleton.example9.OneExtend@6b97fd
t2==cn.javass.dp.singleton.example9.OneExtend@1c78e57
t3==cn.javass.dp.singleton.example9.OneExtend@5224ee
t4==cn.javass.dp.singleton.example9.OneExtend@6b97fd
t5==cn.javass.dp.singleton.example9.OneExtend@1c78e57
t6==cn.javass.dp.singleton.example9.OneExtend@5224ee
第一个实例和第四个相同,第二个与第五个相同,第三个与第六个相同,也就是说一共只有三个实例,而
且调度算法是从第一个依次取到第三个,然后回来继续从第一个开始取到第三个。
当然这里我们不去考虑复杂的调度情况,也不去考虑何时应该创建新实例的问题。
注意:这种实现方式同样是线程不安全的,需要处理,这里就不再展开去讲了。
2:何时选用单例模式
建议在如下情况中,选用单例模式:
• 当需要控制一个类的实例只能有一个,而且客户只能从一个全局访问点访问它时,可以选用单例模式,
这些功能恰好是单例模式要解决的问题
单例模式总结:
很多模式都可以使用单例模式,只要这些模式中的某个类,需要控制实例为一个的时候,就可以很自然的
使用上单例模式。比如抽象工厂方法中的具体工厂类就通常是一个单例。
分享到:
相关推荐
例如,讲解如何在Android框架层中发现单例模式,或者如何在View层次结构中看到组合模式的体现,这些实例能帮助读者更好地理解设计模式在实际系统中的工作原理。 6. **实战应用**:除了理论知识,书中的实例和实战...
创建型模式关心对象的创建过程,包括工厂方法模式、抽象工厂模式、建造者模式、原型模式和单例模式等。结构型模式关心类和对象的组合,包括代理模式、装饰者模式、适配器模式、桥接模式、组合模式、外观模式和享元...
1. 创建型模式(Creational Patterns):主要处理对象的创建,包括单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。...
创建型模式关注对象的创建,如单例模式、工厂模式和建造者模式等,它们提供了不同方式来创建对象,使得代码更加灵活,易于维护。结构型模式处理对象组合和继承关系,如适配器模式、装饰器模式和代理模式等,这些模式...
2. **创建型模式**:包括单例模式、工厂模式(简单工厂、工厂方法、抽象工厂)、建造者模式、原型模式等,它们关注于如何创建对象,减少类之间的耦合。 3. **结构型模式**:如适配器模式、装饰器模式、代理模式、...
另外,工厂模式常用于创建数据库连接池,如C3P0或DBCP,而单例模式常用于配置管理类,确保在整个应用中只有一个实例存在。 书中还会讨论到面向对象设计的原则,如单一职责原则(SRP)、开闭原则(OCP)、里氏替换...
探讨了单例模式的设计原则及其在实际开发中的作用。 - **第6章**:封装调用:命令模式。介绍命令模式的概念以及如何通过它来简化代码结构。 - **第7章**:适应性强:适配器模式和外观模式。这两种模式分别解决了不同...
Android源码设计模式分析开源项目 该系列文章已经重新深度整理并出版 该系列文章已经根据技术发展、实战需求以及读者您的反馈重写所有章节,并且加入更加深入的核心机制分析以及...单例模式 Mr.Simple Builder模式
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。这些模式是由经验丰富的开发者在长期实践中总结出来的,为软件设计提供了可复用的解决方案。"设计模式 相关资料 design pattern...
2. **设计模式**: 设计模式是解决常见编程问题的模板,例如单例模式、工厂模式、观察者模式等。如果这些代码中包含了这些模式的应用,那么它们将为学习者提供实际的实现示例,有助于理解和掌握设计模式的精髓。 3. ...
设计模式并不直接解决特定的编程问题,而是提供了一种通用的思考框架,帮助我们在特定场景下做出更合理的设计决策。设计模式通常分为三类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和...
1. **单例模式**:在Android中,单例模式常用于管理应用程序的全局资源,如网络连接、数据库访问等,确保在整个应用程序生命周期内只有一个实例存在。 2. **观察者模式**:Android的BroadcastReceiver就是观察者...
1. 设计模式概述:文件可能包含了设计模式的基本概念,例如工厂模式、单例模式、建造者模式、观察者模式、装饰器模式等,以及它们在软件开发中的作用。 2. 实例分析:每个设计模式通常会配以实际代码示例,可能是用...
在《Java设计模式(疯狂Java联盟版)》中,你将学习到如单例模式(确保一个类只有一个实例)、工厂模式(提供创建对象的最佳方式)、装饰器模式(动态地给对象添加新的行为或责任)等经典模式。理解并能灵活运用这些...
- 项目中可能应用了一些经典的设计模式,如单例模式(管理数据库连接)、工厂模式(创建账户对象)等,提高代码的可维护性和扩展性。 9. **单元测试**: - 使用JUnit进行单元测试,确保各个模块的功能正确无误。 ...
设计模式是软件工程的最佳实践,常见的有单例模式、工厂模式、观察者模式、装饰器模式等23种经典设计模式。面试官通常会询问你对这些模式的理解,以及如何在实际问题中选择和应用模式。 除此之外,JVM内存模型、...
在本项目中,你可能会遇到单例模式、工厂模式、观察者模式、装饰器模式等经典设计模式。掌握这些模式可以提高代码的可复用性和可维护性,使得软件架构更加合理。 最后,集成常见组件的测试是实际项目中的常见任务。...