创建型设计模式之——单例模式

目录

一 简介

二 代码

三 小结


一、简介

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,创建与使用分离,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

共有三类设计模式,如下(*^_^*)

二、代码

我们先从简单的单例说起吧。单例,顾名思义,整个系统其实就只有一个实例存在,不能再多,否则就不叫单例。那我们把整个宇宙看做是一个庞大的系统,这宇宙里有各种对象存在,人啊,动物啊,植物啊不胜枚举,这些都是实例,丰富多彩的世界是美好的。然而,持续几千年的战争给世界带来了巨大灾难,尤其是宗教战争最为残忍,各个信仰间存在极大的世界观价值观冲突。

单印度一个国家就有几百个神,人们各信各的,风俗各异,各邦文化冲突不断,语言不通,办事效率极低。

为了让幸福美好洒满人间,那我们就定义一位神吧,独一无二的神。

我们先写一个God类吧,类中空空如也,世界如此清净,虚无缥缈。

public class God {

}

首先我们得保证任何人都不能去创建神的实例,否则如:new God(),这样世界又要陷入战争的灾难,各种造神运动,或是某天又出来个什么神棍先知告诉信徒说他们肚子里有个轮子。那就不写构造方法吧?不行,因为有默认的无参构造器!那就把构造方法改成private吧,也就是神可以自己创造自己,但别人不能。

public class God {
    private God(){}//构造方法私有化
}

God类里面封装一个God自己,对,一切都是神创造的,包括我们人类。有人开始质疑,那神是谁?神自己是谁造的?这是个哲学问题。神说“I am who I am.” 我是我所是,我就是我,自有永有,超越时空。很逆天吧? 好吧,谁也不能造上帝,神自己造自己。

public class God {
    private static final God god = new God();//自有永有的神单例
    private God(){}//构造方法私有化
}

以上private关键字保证了上帝的私有性,不可见性,不可访问性,我想没有活人见过上帝吧?static关键字保证上帝的静态性,他与类同在,不依赖于类的实例化就自有永有,他将在内存中永生,GC垃圾回收器也回收不了他。final关键字则保证这位神是和常量,衡量,他是终极上帝,不能再改。

 

正如同静态方法main(),不需要实例化类就能运行的入口,同样我们需要一个静态方法getInstance()来请神,方法体内我们就返回这个在唯一的真神,当然方法它必须是public公开的,不然谁都访问不了。

public class God {
    private static final God god = new God();//自有永有的神单例
    private God(){}//构造方法私有化
    public static God getInstance(){//请神方法公开化
        return god;
    }
}

 

以上的神类雏形已经写好了,当然你还可以加其他的功能方法,比如说创世纪神造了光,造了世界、动物、人、亚当夏娃等等功能,我们这里就不在赘述了。那对于外部来说只要调用God.getInstance();就可以拿到神了,而且不管谁拿,拿几次,都是同一个神,这样就保证了整个系统中神的唯一性,不可伪造性,至于其他先知那也只是神的代理人,只能帮请神而已。

 

好了,其实我们已经学会了单例模式的“饿汉模式(Eager load)”,代码第一行一开始就造出了神(new God那一句),已经准备好了随时给你请神,这样就有了一个问题,如果没人请神那不是白造了?提前备货如果价格跌了不是很惨?反应在系统中的问题就是占用了内存空间。于是又有了“懒汉模式(Lazy load)”

public class God {
    private static God god;//这里不进行实例化
    private God(){}
    public static God getInstance() {
        if (god == null) {//如果无神才造神
            god = new God();
        }
        return god;
    }
}

这我们看到一开始就没有造神,只有某人第一次求神时才实例化,之后再求的就直接返回了。这样的好处是省了一段时间的内存(无求神期间),坏处是第一次请神的时候速度相较之前的痴汉模式会慢,因为要消耗CPU去造神。

其实在这之上还发展出了各种各样的单例模式变种,我们这里只讲了最基础的两种,其实他们都各有优缺,我们要做到灵活运用,各取所需。

 

三、小结

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。            

 

ps:本文是读于凸凹里歌作者的文章,在java知音公众号专栏之《设计模式是什么鬼》所见,自己写了写,遂记下保存。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值