(一)初识23种设计模式之-----单例设计模式

一  什么是设计模式?

  通俗来说,设计模式就是牛人总结的解决某个问题的方案,这套方案被大多数人熟知和认可。

  设计模式大致分为三种:

  结构型

    过滤器模式 组合模式 装饰器模式 外观模式 享元模式,代理模式

  创建型

       单例模式 工厂模式 抽象工厂模式 建造者模式 原型模式

  行为型

         责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 空对象模式 策略模式  模板模式 访问者模式

说起设计模式,就不得不说起设计模式的六大设计原则

一  单一职责原则(Single Responsibility Principle - SRP)

  一个类,只有一个引起它变化的原因。应该只有一个职责。

如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。

二  开闭原则(Open-Closed Principle - OCP)

   一个软件实体应当对扩展开放,对修改关闭。也就是说设计一个模块的时候,应当使这个模块在不被修改的前提下扩展。

里氏代换原则(Liskov Substitution Principle,或者LSP)

  任何基类可以出现的地方,子类一定可以出现(对实现抽象化的具体步骤的规范)

迪米特法则(Law of Demeter,或者LoD)、

  一个软件实体应当与尽可能少的实体发生相互作用(修改尽可能少的设计其他模块)

接口隔离原则(Interface Segregation Principle,或者ISP)  

  应为客户端提供尽可能少的单独的接口,而不要提供大的总接口(限制通信的宽度和深度)

六 依赖倒转原则(Dependency Inversion Principle,或者DIP)

  依赖于抽象,不依赖于实现

此外也有其他设计原则,这里就不再详细叙述了,如 :

  组合/聚合复用原则(Composition/Aggregation Principle,或者CARP)

二 单例设计模式(Singleton Pattern)

  在程序的运行过程中,只有一个实例的存在(如:我们手机中只有一份联系人信息,而许多应用都需要读取这份信息,联系人信息就可以设计为单例)

1)饿汉单例模式

  public class Singleton {
    //1)构造方法私有化
    private Singleton(){};
    //2)定义一个私有的静态本类对象
    private static Singleton obj=new Singleton();
    //3)提供一个公共的静态方法,返回这个本类对象
    public static Singleton getInstance(){
        return obj;
    }
}

  优点 
    1.线程安全 
    2.在类加载的同时已经创建好一个静态对象,调用时反应速度快 
缺点 
    资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化

2)懒汉单例模式

  public class Singleton2 {
    //1)构造方法私有化
    private Singleton2(){};
    //2)定义私有的静态的本类对象,不初始化
    private static Singleton2 obj;
    //3)提供一个公共的静态方法,返回这个本类对象(饿汉单例模式在多线程情况下可能存在线程安全问题,因此需要加synchronized关键字)
    public static synchronized Singleton2 getInstance(){
        if(obj==null){
            obj=new Singleton2();
        }
        return obj;
    }
}

优点: 
    避免了饿汉式的那种在没有用到的情况下创建事例,资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法。 
缺点:

懒汉式在单个线程中没有问题,但多个线程同事访问的时候就可能同事创建多个实例,而且这多个实例不是同一个对象,虽然后面创建的实例会覆盖先创建的实例,但是还是会存在拿到不同对象的情况。解决这个问题的办法就是加锁synchonized,第一次加载时不够快,多线程使用不必要的同步开销大。

测试代码

public class Demo {
    public static void main(String[] args) {
    
    Singleton obj1=Singleton.getInstance();
    Singleton obj2=Singleton.getInstance();

  System.out.println(obj1);

  System.out.println(obj2);

  }

}

图解:

程序运行时,把Demo和Singleton的字节码文件加载到内存中,在Singleton类中有一个静态变量,类加载内存时在方法区的静态变量区中给obj这个变量分配空间,new运算会在堆中分配存储空间(如:0x1234),我们无论调用多少次getInstance()静态方法,返回的都是obj,因此都指向同一块堆内存。

通过单例设计模式,可以在多个类中共享数据。在某些情况下,利用单例可以节省资源,避免频繁的创建对象。

原文地址:https://www.cnblogs.com/zhaoletian/p/8428443.html

时间: 2024-10-09 09:54:09

(一)初识23种设计模式之-----单例设计模式的相关文章

java设计模式之单例设计模式

设计模式:解决某一类问题最行之有效的方法. java中23种设计模式. 单例设计模式:解决一类在内存中只存在一个对象. Runtime()方法就是单例设计模式进行设计的. 解决的问题:保证一个类在内存中的对象唯一性. 比如:多程序读取一个配置文件时,建议配置文件封装成对象.会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的. 1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象. 2.还为了让其他程序可以访问该类对象,只好在本类中自定

java软件设计模式只单例设计模式

概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 设计模式分为三种类型,共23种.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.

设计模式总纲——单例设计模式

前两天写了设计模式总纲,今天就来讲讲我们在工程代码中最最最常用的设计模式了——单例设计模式,这个模式在工程代码上的出现率几乎为99.99999%,但是虽然很常用,但是用的好的人却不多,今天我们就来深入的说一说单例设计模式. 在学习一项新的知识之前,我们都要向自己提出三个问题,为什么要用这个知识,这个知识用在哪里,这个知识怎么用?既 why,where,how,3W模式,我们先来谈谈为什么需要单例设计模式,先来想想,如果一个工具类,比如一个读取配置文件的工具类,这类工具只是特定的功能类,既读取指定

设计模式之-----------单例设计模式

饿汉式: class Single { //   提前做好! private static final Single s = new Single(); //  私有化 构造函数  无法使用new 创建对象! private Single(){} //  对外提供接口 public static Single getInstance() { return s; } } 懒汉式: 懒汉 顾名思义  就是懒呗 什么时候用到 什么时候创建! class Single1 { private static

java设计模式_single(单例设计模式)

设计模式:解决某一类问题最行之有效的方法,java中有23种设计模式 一.单例设计模式概述: 1.解决一个类在内存中只有一个对象(保证一个类仅有一个实例,并提供一个访问他的全局访问点)  2.要保证对象的唯一: 1.为了避免其他程序过多的建立该类对象,先禁制其他程序建立该类对象 2.为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象 3.为了 方便其他程序对自定义对象的访问,可以对外提供一些访问方式 3.代码实现步骤: 1.将构造函数私有化 2.在类中创建一个本类对象 3.给外部提供

Java设计模式之一 单例设计模式

1.什么叫设计模式: 设计模式的概念首先来源于其它行业:建筑业,在早起建房子的时候,肯定是经验缺乏.显得杂乱无序的,这就会造成很多问题,在行业发展过程,通过不断的经验积累,前辈们针对这些问题提出了合理解决方案,这就是设计模式,参照设计模式往往可以解决很多问题,在计算机编程方面,也会出现类似问题,所以牛人们把这些解决问题的方案进行归类和总结,形成了面向对象编程的23种设计模式. 2.单例模式(特点): Java中单例模式定义:"一个类有且仅有一个实例,并且自行实例化向整个系统提供."通过

设计模式之单例设计模式

一.何为单例设计模式 单例模式,顾名思义就是单个实例,程序中某个类只有一个实例存在.通常实在需要共享某个资源避免资源损耗的情况下使用到的. 二.单例设计模式的代码实现 一说到单例模式的概念,我们首先会想到下面的这种的写法 public class SingleInstance { private static SingleInstance singleInstance; /** * 单例模式 * @return */ public static SingleInstance getSingleI

【设计模式】单例设计模式的N中Java实现方法

特点 单例模式的特点: 1.只能有一个实例: 2.必须自己创建自己的一个实例: 3.必须给所有其他对象提供这一实例. 饿汉式单例模式 也称为预先加载法,实现方式如下: [java] view plaincopy class Single { private Single()( Syustem.out.println("ok"); ) private static Single instance = new Single(); public static Single getInstan

菜鸟之路-浅谈设计模式之单例设计模式

单例设计模式 定义:确保一个类仅仅有一个实例.并且自行实例化并向整个系统提供这个实例. 单例模式是一种经常使用的软件设计模式.在它的核心结构中仅仅包括一个被称为单例的特殊类. 通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问,从而方便对实例个数的控制并节约系统资源.假设希望在系统中某个类的对象仅仅能存在一个,单例模式是最好的解决方式. 关于单例设计模式的动机 对于系统中的某些类来说,仅仅有一个实例非常重要,比如.一个系统中能够存在多个打印任务.可是仅仅能有一个正在工作的任务: