Java设计模式——单例设计模式

单例设计模式

1.什么是设计模式?我们为什么用学习设计模式呢?

设计模式是一套面向对象的代码设计经验总结,早期开发人员通过不断地经验累积,以及对问题的解决方案的总结与归纳,形成了面向对象编程的23种设计模式。

设计模式是一种思想,一种设计模式就是一种解决方案。通过使用设计模式,可以让我们的代码易扩展,复用性更高,可维护性更高,灵活性更好。

2.什么是单例设计模式?

定义:一个类只允许产生一个实例化对象
特点:构造方法私有化,外部无法产生新的实例化对象,只能通过static方法取得实例化对象

3.单例设计模式解决的问题

保证一个类在内存中的对象的唯一性,在一些常用的工具类、线程池、缓存,数据库,账户登录系统、配置文件等程序中可能只允许我们创建一个对象,一方面如果创建多个对象可能引起程序的错误,另一方面创建多个对象也造成资源的浪费。在这种基础之上单例设计模式就产生了。
4.单例模式设计思想

首先要想保证只有一个实例化对象,就必须限制对象的产生,也就是说不允许其他程序随意使用new创建对象,而使用new创建一个新对象时必须调用该类的构造方法,因此,我们可以让该类的构造方法私有化,代码如下:

class Singleton{
private Singleton(){//私有构造方法
}
public void print() {
System.out.println("Hello World");
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton = null ; // 声明对象
singleton = new Singleton() ; // 实例化对象
singleton.print();
}
}

当我们把构造方法私有化后,这就意味着在类的外部无法产生实例化对象,如果此时想要继续调用Singleton类的print()方法,那么必须提供实例化对象。考虑到封装的特点,可以在类的内部产生一个实例化对象

class Singleton{
// 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
Singleton instance = new Singleton() ;
private Singleton() { // private声明构造
}
public void print() {
System.out.println("Hello World");
}
}

现在Singleton内部的instance对象(属性)是一个普通属性,所有的普通属性必须在有实例化对象的时候才能进行内存空间的分配,而现在外部无法产生实例化对象,所以必须想一个办法,可以在Singleton没有实例化对象产生的时候,也可以将instance进行使用。此时,联想到使用static关键字。

class Singleton{
// 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
static Singleton instance = new Singleton() ;
private Singleton() { // private声明构造
}
public void print() {
System.out.println("Hello World");
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton = null ; // 声明对象
singleton = Singleton.instance ;
singleton.print();
}
}

以上虽然可以取得Singleton类的实例化对象,但是对于类中属性应该使用private进行封装,要想取得private属性,应该提供getter()方法。由于此时访问的是static属性,并且这个类无法在外部提供实例化对象,因此应该提供一个static的getter()方法,因为static方法也不受对象实例化控制

class Singleton{
// 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
private  final static Singleton instance = new Singleton() ;
//此时该实例化对象属于一个类的属性(除了方法,就是属性)
//final保证在类的内部也只能有一个实例化对象(属性)
private Singleton() { // private声明构造
}
public static Singleton getInstance() {//得到该唯一实例化对象(属性)的方法
//此处getter方法也是static的,以此来保证在类的外部使用类名.方法名直接调用
return instance ;
}
public void print() {
System.out.println("Hello World");
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton = null ; // 声明对象
singleton = Singleton.getInstance() ;//得到唯一的实例化对象
singleton.print();
}
}

以上就是单例模式的设计思想,具体过程总结如下:

第一步:私有化该类的构造函数
第二步:通过new在本类中创建一个本类对象
第三步:定义一个静态的方法,返回在类中所创建的唯一的实例化对象

5.单例设计模式的两种形式

单例设计模式有两种形式:饿汉式和懒汉式
以上代码是饿汉式的应用,它的特点是:不管你是否使用Singleton类的对象,只要该类加载了,那么一定会自动创建好一个公共的instance对象。而与饿汉式不同的就是,懒汉式当第一次去使用Singleton对象的时候才会为其产生实例化对象的操作。

懒汉式单例设计模式代码如下:

class Singleton{
private static Singleton instance ;//与饿汉式的区别,懒汉式没有使用new新建实例化对象
private Singleton() { // private声明构造
}
public static Singleton getInstance() {
if (instance==null) { // 表示此时还没有实例化
instance = new Singleton() ;
}
return instance ;//如果已经实例化,直接返回对象
}
public void print() {
System.out.println("Hello World");
}
}
public class SingletonTest {//此处与饿汉式相同
public static void main(String[] args) {
Singleton singleton = null ; // 声明对象
singleton = Singleton.getInstance() ;
singleton.print();
}
}

参考博客:https://blog.csdn.net/dmk877/article/details/50311791

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值