设计模式-单例设计模式 应用场景及优缺点,扩展,多种写法
设计模式就是对未知变化的一种封装方式:
主要的设计原则:1.单一职责原则(这个基本扯淡,实际开发中尽量吧);2.开闭原则;3.里氏替换原则;4.迪米特法则;5.接口隔离原则;6.依赖倒置原则.
单例设计模式又是其中最经典的,面试也问的最多的,所以让我们一起看看单例设计模式吧
其实也就是那么一说,项目开发的这种规则的制定,主要是技术主管的技术选型和项目业务功能的一种磨合选择吧.
实际说一下开发模式,一个一个的来.
单例模式
目的:确保只有一个实例,并且自行实例化并向系统提供这个实例
直接上代码(我喜欢这种模式)
public class Emperor {
private static final Emperor emperor = new Emperor();
private Emperor() {
}
public static Emperor getInstance() {
return emperor;
}
public static void doSomething() {
System.out.println("做什么事情");
}
}
私有构造函数,防止new出来.所以只能通过getInstance来获得本个实例.
单例的优点:
我觉得就两个:1.减少系统的开销;2.对系统级的文件或者映射等做一个单点的操作.
单例的缺点:
- 一般不会进行继承或者实现接口.所以扩展性差
- 对测试不利.如果在并行开发中,单例没有实例出来,那么是不能进行测试的
- 和”单一原则”违背(并没什么luan用)
使用场景
在一个环境中,要求 有且只有一个对象的时候可以使用.
- 一个序列号;
- 一个共享数据
- 创建一个对象消耗资源过多
- 工具类
单例的扩展:
要求有限多个实例对象的时候
public class Emperor { private static Integer MAX_SINGLETON_NUM = 2; private static List<Emperor>list = new ArrayList<>(); static { for (int i = 0; i < MAX_SINGLETON_NUM; i++) { list.add(new Emperor()); } } private Emperor() { } public static Emperor getInstance(){ Random rd = new Random(); int num = rd.nextInt(MAX_SINGLETON_NUM); return list.get(num); } public static void doSomething(){ System.out.println("做什么事情"); } }
补充:单例模式的基本模式
饿汉:双重验证才能达到真单例
public class Singleton { 2 private volatile static Singleton singleton; 3 private Singleton (){} 4 public static Singleton getSingleton() { 5 if (singleton == null) { 6 synchronized (Singleton.class) { 7 if (singleton == null) { 8 singleton = new Singleton(); 9 } 10 } 11 } 12 return singleton; 13 } 14 }
静态内部类
1 public class Singleton { 2 private static class SingletonHolder { 3 private static final Singleton INSTANCE = new Singleton(); 4 } 5 private Singleton (){} 6 public static final Singleton getInstance() { 7 return SingletonHolder.INSTANCE; 8 } 9 }
其实单例用哪种模式,取决于项目的实际业务需求.如果启动的东西太多希望节约点资源就用”懒汉”,对于这点资源还能消耗,并且希望简单,法改变的就使用”饿汉”,一启动就加载了.
个人喜欢用”饿汉”.
感谢单例的七种写法:http://www.blogjava.net/kenzhh/archive/2013/03/15/357824.html
其实就会”饿汉”和有限多个单例,就足够用了.