linkin大话设计模式



开文前先弱弱的问一句:什么是设计模式?我在研究java2ee的时候有研究过,在学js的时候也有看到。设计模式的概念最早源于建筑设计大师《建筑的永恒算法》一书,它表示一个特定的环境,一类问题和一个解决方案之间的关系。对于软件领域,设计模式就是对处于特定的环境下,经常出现的某类软件开发问题的,一种相对成熟的设计方案。



设计模式(Design pattern)是一套被反复使用,多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。设计模式有好多,如下中选中的是比较常用的也是比较重要的模式,我会在具体的介绍后贴出相应的代码,方便以后查看。



  • 一、单例模式

常见单例模式类型:
饿汉式单例
懒汉式单例

懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。初始化对象的时候直接new出单例。

饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。初始化对象的时候null,用到的时候判断,要是单例是null,才会去new。

这两种模式对于初始化较快,占用资源少的轻量级对象来说,没有多大的性能差异,选择懒汉式还是饿汉式都没有问题。但是对于初始化慢,占用资源多的重量级对象来说,就会有比较明显的差别了。所以,对重量级对象应用饿汉模式,类加载时速度慢,但运行时速度快;懒汉模式则与之相反,类加载时速度快,但运行时第一次获得对象的速度慢。

从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式。


具体的代码如下:

/**
*
* @version 1L
* @author LinkinPark
* @since 2014-10-31
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^这里这种是懒汉模式,会有线程安全问题。其实还有更加完美的写法:避免多线程创建多个实例 ----->双重检查锁定
* 大牛推荐使用恶汉模式,就是下面这个用来缓存实例的变量instance直接赋值new Singleton()。
*/
public class Singleton {
//使用一个变量来缓存曾经创建的实例
private static Singleton instance; //使用private限定符,隐藏构造器
private Singleton() { } //暴漏静态方法,用于获得singleton的单例,方法内可以加入自己定义的逻辑。
public static Singleton getInstance() {
//如果实例存在了 就不要重复创建了 保证每次获得的就是第一次创建好的实例 对于下面这种双重检查锁定的方法 显得有点太复杂了耶
/*if (instance == null) {
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}*/
if(instance == null){
instance = new Singleton();
}
return instance;
} public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
//输入是true 其中2个实例对象其实就是instance
System.out.println(singleton1 == singleton2);
} }


使用枚举来实现单例模式的好处是这样非常简洁,并且无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。
  ——来自《Effective Java》(作者:Josh Bloch)
代码如下:
public enum Singleton {
INSTANCE;//唯一实例 public static Singleton getInstance(){
return INSTANCE;
} public void show(){
System.out.println("使用enum实现单例模式");
}
}

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">在java2ee中,单例模式是一种应用非常广泛的设计模式。应用的好多组件都需要单个实例,这个时候就考虑使用单例模式。使用单例模式主要是有2个优势:</span>

1:减少创建java实例所带来的系统开销;

2:便于系统跟踪单个java实例的生命周期,实例状态等

 































linkin大话设计模式--单例模式的更多相关文章

  1. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  2. linkin大话设计模式--适配器模式

    linkin大话设计模式--适配器模式 大家知道,在java中只允许单继承,但是在实际问题中往往都需要多继承,java引入了接口这一概念.(一个类可以实现多个接口) 由于接口中都是抽象方法,那么我们在 ...

  3. linkin大话设计模式--建造模式

    linkin大话设计模式--建造模式 建造模式是对象的创建模式,可以讲一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 建造模式的结构: 抽象建造者 ...

  4. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  5. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

  6. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

  7. linkin大话设计模式--门面模式

    linkin大话设计模式--门面模式 随着系统的不断改进和开发,他们会变得越来越复杂,系统会生成大量的类,这使得程序的流程更加难以理解.门面模式可以为这些类提供一个简易的接口,从而简化访问这些类的复杂 ...

  8. linkin大话设计模式--策略模式

    linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi]  策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...

  9. linkin大话设计模式--命令模式

    linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...

随机推荐

  1. wifipineapple的evilportal

    复制模块: scp -r evilportal root@172.16.42.1:/pineapple/components/infusions 更新数据源, 更新相关依赖: opkg update ...

  2. Python 浅析线程(threading模块)和进程(process)

    线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 进程与线程 什么 ...

  3. Talking appsettings.json in Asp.Net Core

    在ASP.NET Core中,默认提供了三个运行时环境变量,通过查看Hosting源代码我们可以看到,分别是Development.Staging.Production public static c ...

  4. Django date__range([start,end])其中不包括end时间

    # date__range([start,end]) # 不包括end时间,需转换最后的截止时间 from datetime import datetime, timedelta new_end = ...

  5. React Native随笔——组件TextInput

    一.实例 先看一下我要做的搜索框的样子 需要一个Image,和一个TextInput 去掉默认下划线 underlineColorAndroid='transparent' 设置光标颜色 select ...

  6. 菜鸟VUER学习记——零0章、打开新的大门

    是什么 基于MVVM模型,核心库只关注视图层,通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件的js框架.根据项目的复杂度和需求,渐进的加入插件以达到恰到好处的程度. 解决问题 UI组件化 ...

  7. 整理C++面试题for非CS程序猿——更新至【48】

    结合网上的C++面试题+自己的面经,进行整理记录,for我这种非CS的程序猿.(不定期更新,加入了自己的理解,如有不对,请指出) [1] new/delete和malloc/free的区别和联系? 1 ...

  8. <魔域>按键精灵脚本

    用了三天时间才写完,实现了通过图片识别读取坐标数值,自动寻路等简单功能. 主要的难点在于游戏中的坐标系,和电脑屏幕的坐标系存在三维旋转关系,难以换算. //全局变量:第一个数左上右下坐标 Global ...

  9. JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别

    一.包装类 Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足, 在设计类时为每个基本数据类型设计了一个对应的类进行代表,这 ...

  10. msf

    show exploit show payload msf使用数据库加快搜索,不然每次都等半天 service postgresql startmsfdb reinitmsf > db_rebu ...