最近在学习软件工程中的设计模式,学一个总结一个。 方便自己,方便他人。 单例模式指的是一个类只有一个实例对象,且这个类能自行创建这个实例对象的一种模式。比如,我们的Windows 系统只能打开一个任务管理器,避免系统资源浪费或者产生一些不必要的错误。 在某些场合,我们为了节省内存、或者说为了保证数据内容的一致性,对某些类要求只能创建一个实例对象,这就是Java设计模式中的单例模式。 在我们平时办公的时候,比如桌面上的回收站、任务栏可打开的任务管理器,这些就是单例模式很好的说明。 单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。 类加载时没有生成实例化对象,只有当第一次调用获取实例方法时才去创建这个单例对象。 核心代码: 当私有对象为null,创建对象;当私有对象已存在,则返回这个对象。 完整代码: 其中关键字 volatile 和 synchronized是为了保障多线程环境下的安全问题,但同时会影响性能,且消耗更多的资源,这是懒汉式单例的缺点 执行后输出: 因为第一次创建Cat对象的时候,因为变量cat为空,所以创建;第二次创建对象的时候发现cat不为空,则直接返回这个对象。最后比较这两个对象,结果相同。 类一旦加载就创建一个单例,保证在调用 获取对象方法之前单例已经存在了。 核心代码: 当类创建的时候,直接new一个Dog对象,后续获取该对象的时候,直接返回即可。 完整代码: 输出结果: 因为类初始化的时候就创建了对象,后续调用的方法都是返回这个对象,所以只在初始化的时候创建了一次,两个对象相同。 总而言之,单例模式就是说一个类只能创建一个对象,当创建多个对象的时候,返回第一次创建的对象,其通过构造函数私有化来保证实现。
概念
特点
1. 单例类只有一个实例对象,不能实例化多个对象
2. 该类的构造函数是私有的,即对象必须由单例类自行创建
3. 该类必须有一个公有的对象获取方法,即对外提供一个访问该单例对象的接口
实现
1. 懒汉式单例
if(cat == null) { cat =new Cat("懒汉式单例cat"); System.out.println("产生了新的单例cat"); }else { System.out.println("单例cat已经存在"); }
package ypc.zwz.DanLi; public class LanHan { public static void main(String[] args) { Cat cat01 = Cat.getCat(); Cat cat02 = Cat.getCat(); if(cat01 == cat02) { System.out.println("两只猫相同"); }else { System.out.println("两只猫不同"); } } } class Cat{ private static volatile Cat cat=null; private String name; private Cat(String name) { System.out.println("产生了一个Cat对象:" + name); } public static synchronized Cat getCat() { if(cat == null) { cat =new Cat("懒汉式单例cat"); System.out.println("产生了新的单例cat"); }else { System.out.println("单例cat已经存在"); } return cat; } public String getName() { return this.name; } }
产生了一个Cat对象:懒汉式单例cat 产生了新的单例cat 单例cat已经存在 两只猫相同
2. 饿汉式单例
private static volatile Dog dog=new Dog("饿汉式单例Dog"); public static Dog getDog() { return dog; }
package ypc.zwz.DanLi; public class EHan { public static void main(String[] args) { Dog dog01 = Dog.getDog(); Dog dog02 = Dog.getDog(); if(dog01 == dog02) { System.out.println("两只狗相同"); }else { System.out.println("两只狗不同"); } } } class Dog{ private static volatile Dog dog=new Dog("饿汉式单例Dog"); private String name; private Dog(String name) { System.out.println("产生了一个Dog对象:" + name); } public static Dog getDog() { return dog; } public String getName() { return this.name; } }
产生了一个Dog对象:饿汉式单例Dog 两只狗相同
总结
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算