一:设计模式由来
1.模式是如何诞生的?让我们先来认识一个人——Christopher Alexander(克里斯托弗.亚历山大),哈佛大学建筑学博士,不过他还有一个“昵称”——模式之父(The father of patterns)。Christopher Alexander博士及其研究团队用了约20年的时间,对住宅和周边环境进行了大量的调查研究和资料收集工作,发现人们对舒适住宅和城市环境存在一些共同的认同规律,Christopher Alexander在著作A Pattern Language: Towns, Buildings, Construction中把这些认同规律归纳为253个模式,对每一个模式(Pattern)都从Context(前提条件)、Theme或Problem(目标问题)、 Solution(解决方案)三个方面进行了描述,并给出了从用户需求分析到建筑环境结构设计直至经典实例的过程模型。
2.在前辈们的不懈努力下。将设计模式理念引入我们java中。设计模式,就是许多程序员在解决软件工程类的设计问题时所总结出来的有用经验以及解决某些特定问题的可实施的,高效的方案或者思想。举个非常简单的例子,就如同我们做题时,争对某类型的题目而专门总结出来的答题模板。有了这些模板,我们再遇到相同类型的题目时,能够快速的,高效的,准确的解决题目。
3.在经过时间的检验和先辈们的精心筛选,总结,最终将这些可实施的,高效的方案归为23种设计模式,分别为:单例模式,抽象工厂模式,适配器模式,桥梁模式,建造模式,责任链模式,命令模式,合成模式,装饰模式,门面(外观)模式,工厂方法模式,享元模式,解释器模式,迭代子模式,调停者模式,备忘录模式,观察者模式,原始模型模式,代理模式,状态模式,策略模式,模板模式,访问者模式。今天,主要介绍23种模式种的必会之一的模式-----单例模式
二.java中普通的类实例化对象
1.新建一个Student类,里面有学生的名字,年龄,性别等属性以及sayhi()这一方法
2.新建一个学生类测试类
3. 可以从图中看出,没有任何处理的普通类只要传入的参数不相同,可以创建无数个对象实例,单例模式恰恰与之相反,单例设计模式的思想为:确保一个类只能有一个实例,无论怎么访问,都是最开始的那个类。
三.单例设计模式
1.概念:顾名思义,单个的实例,就是在开发过程中,采取一定的方法使得在一个类中只能存在一个对象实例,并且只提供一个能获取该实例的方法。
2.单例设计模式可以分为两种:(1).饿汉式 (2).懒汉式
饿汉式实现步骤:(1).将构造器私有化。--------》目的:防止直接new对象
(2).在类的内部创建对象。
(3).向外暴露一个公开的方法。
2.1代码演示:
新建一个朋友类,这只是一个普通的类,用来对比
第一步:将构造器私有化。--------》目的:防止直接new对象
第二步:在类的内部创建对象
第三步:向外暴露一个公开的方法
分析:由于将构造器私有化,因此不能直接 new 对象,想要获取对象实例,只能通过暴露的公开方法去获取,无论执行多少次静态的公开方法,所得到的对象都是同一个对象。
懒汉式实现步骤:(1).将构造器私有化。--------》目的:防止直接new对象
(2).定义一个静态属性对象
(3).提供一个公开的方法可以返回一个对象
注:懒汉式采用的方法为线程不安全,只推荐使用单线程进行使用。
2.2.代码演示
还是使用上面已经建好的 Friend作比较
第一步:将构造器私有化。--------》目的:防止直接new对象
第二步:定义一个静态属性对象
第三步:提供一个公开的方法可以返回一个对象
分析: 还是将将构造器私有化,不能直接 new 对象,想要获取对象实例,只能通过暴露的公开方法去获取。
3.饿汉式与懒汉式对比
(1).创建对象的时机不同
<饿汉式>
<懒汉式>
分析:饿汉式是在类加载就创健了对象实例,而懒汉式是在使用时才创建。在饿汉式中,假如一个程序员没有使用对象实例,那么意味着饿汉式创建的对象就会浪费,但是懒汉式创建对象是在使用时才创建对象,因此不会造成资源浪费的情况。
(2).线程安全问题
<懒汉式>
如图,假如多个线程同时进入这个方法判断,并且在前面进入的线程还没有创建完成对象,后面的线程也同样能够进入if 判断,因此,就破坏了单例条件。
(3).饿汉式存在浪费资源的可能
假如你有一个对象但是没有使用,在类加载的过程中依然会创建,这样就会造成资源浪费,相比较懒汉式,根据名字--"懒",我们也大概知道,它完成类加载时,没有调方法,是不会直接创建对象的,只有你需要使用时,调用公开的方法,才会创建对象,因此不会造成资源浪费的情况。