软件设计模式(Software Design Pattern)

又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性代码的可读性和代码的可靠性

设计模式分类很多,常听过23中主流设计模式;

有四种比较常用的设计模式

单例模式,简单工厂模式,装饰者模式,适配器模式

1.单例模式(重点)

单例模式:即为每次获取的对象都是同一个对象。

单例模式的特点:

1.构造方法私有化(即构造方法被private修饰)

2 该单例对象必须由单例类自行创建

3.内部提供一个公共静态的方法给外界进行访问(方法被public static 修饰)

单例模式又可以分为常说的饿汉式(饥渴型)单例模式和懒汉式(懒狗)单例模式。

这两个又有什么区别呢?

饿汉式(饥渴型)单例模式

在类加载的时候就创建对象,不会出现线程安全问题(因为还没有开始加载的时候就创建好了对象,线程都没有机会去争夺)。

代码实现(一定要熟练掌握,不然面试臊皮)

/*** 饿汉式单例模式* 单例模式的特点:
单例模式的特点:1.构造方法私有化(即构造方法被private修饰)2.该单例对象必须由单例类自行创建3.内部提供一个公共静态的方法给外界进行访问(方法被public static 修饰)*/
public class SingletonHungry {//成员变量 在类加载的时候就把对象创建好了static SingletonHungry s = new SingletonHungry();// 1.构造方法私有化private SingletonHungry(){}// 2.内部提供一个公共的静态方法给外界进行调用和访问// 返回值类型为 SingletonHungry(因为需要通过类进行创建对象)public static SingletonHungry getInstance(){ // 2.该单例对象必须由单例类自行创建// 没有static修饰的成员变量不可以通过静态方法进行调用(所以需要加上)return s; // 调用方法获取的s就是成员变量对象}public static void main(String[] args) {// 因为是static修饰的直接通过类名.方法名()进行调用(如果是非static修饰还需要创建对象,比较麻烦)SingletonHungry i1 = SingletonHungry.getInstance();// 调用方法获取的每一次都是同一个对象SingletonHungry i2 = SingletonHungry.getInstance();System.out.println("获取的对象是否相同:"+(i1==i2));  // 结果为true// 判断获取的对象是不是同一个对象,通过比较地址值}
}

懒汉式(懒狗)单例模式

懒汉式:在需要的时候才创建,类加载时不创建对象

在多线程操作时会出现线程安全问题,但是可以使用线程同步的三种方式进行解决,(1,同步代码块;2,同步方法;3,同步锁)。

代码实现(线程不安全代码案例)

/*** 懒汉式单例模式*    在需要的时候才进行创建对象*  单例模式的特点:1.构造方法私有化(即构造方法被private修饰)2.该单例对象必须由单例类自行创建3.内部提供一个公共静态的方法给外界进行访问(方法被public static 修饰)*/
public class SingletonLazyNoSafety {// 成员变量  private static SingletonLazyNoSafety s;// 1.构造方法私有化public SingletonLazyNoSafety(){}// 3.内部提供一个公共静态的方法供外界进行访问public static SingletonLazyNoSafety getInstance(){if(s == null){// 如果s为null,就创建一个对象s = new SingletonLazyNoSafety();// 2.该单例对象必须由单例类自行创建}return s; // 如果s已经被创建就直接返回s  }// 测试类public static void main(String[] args) {// 因为时static修饰的直接通过类名进行调用  SingletonLazyNoSafety i1 = SingletonLazyNoSafety.getInstance();SingletonLazyNoSafety i2 = SingletonLazyNoSafety.getInstance();// 判断是不是同一个对象System.out.println("获取的对象是否相同:"+(i1==i2)); // 输出结果为true}
}

通过同步代码块+双重校验锁解决线程安全问题并且提高效率。

/*** 懒汉式单例模式*    在需要的时候才进行创建对象*  单例模式的特点:1.构造方法私有化(即构造方法被private修饰)2.该单例对象必须由单例类自行创建3.内部提供一个公共静态的方法给外界进行访问(方法被public static 修饰)*/
public class SingletonLazySafety {// 成员变量  private static SingletonLazySafety s;// 1.构造方法私有化public SingletonLazySafety(){}// 3.内部提供一个公共静态的方法供外界进行访问public static SingletonLazySafety getInstance(){if (s == null) { // 双重校验锁  如果对象s为null(即没有被创就继续执行if里面的内容)// 使用同步代码块实现线程安全synchronized (SingletonLazySafety.class) {if(s == null){// 如果s为null,就创建一个对象s = new SingletonLazySafety();// 2.该单例对象必须由单例类自行创建}}}return s; // 如果s已经被创建就直接返回s    }// 测试类public static void main(String[] args) {// 因为时static修饰的直接通过类名进行调用  SingletonLazySafety i1 = SingletonLazySafety.getInstance();SingletonLazySafety i2 = SingletonLazySafety.getInstance();System.out.println("获取的对象是否相同:"+(i1==i2));}
}

综合得出一个链式结论:

懒汉式单例模式:多线程访问时不安全-->加锁(线程同步方法)-->解决线程安全问题-->出现效率低的问题(因为多线程访问需要等一个线程执行结束过后才执行)-->双重校验锁-->解决效率问题。

其他形式:枚举

/*** 枚举* 注释部分是我自己验证枚举的,不用管*/
public enum SingletonEnum {INSTANCE;//INSTANCE("张三",109);/*   private String name;private int age;private SingletonEnum(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "["+"姓名:"+this.name+","+"年龄:"+this.age+"]";}
*/public void run(){System.out.println("枚举YYDS");}// 测试类public static void main(String[] args) {// 创建枚举对象SingletonEnum instance1 = SingletonEnum.INSTANCE;SingletonEnum instance2 = SingletonEnum.INSTANCE;System.out.println( instance1== instance2);instance1.run();//System.out.println(SingletonEnum.INSTANCE);       }
}

简单工厂模式

优点:实现对象的创建和使用进行分离 ,创建对象交给工厂进行创建,

缺点:工厂类不够灵活,如果需要新增一个产品就需要更改工厂类,修改工厂类中的判断逻辑,如果需要新增很多产品,这个逻辑判断就会非常复杂。

代码实现 简单工厂模式

public class SimpleFactory{ // 专门用来生产对象// 简单工厂创建一个成员方法 返回值类型Productpublic static Product createProduct(String a){if ("A".equals(a)) {// 输入A自动进行创建ProductA对象return new ProductA();  }return new ProductA(); // 否则创建B对象}// main方法进行测试public static void main(String[] args) {// 直接通过类名.方法名()进行调用方法创建获得对象Product p = SimpleFactory.createProduct("A");p.print();// 编译看左边,执行看右边}
}// 创建一个抽象类
abstract class Product{public abstract void print();
}// 创建两个类继承抽象类
class ProductA extends Product{public void print(){System.out.println("产品A");}}
class ProductB extends Product{public void print(){System.out.println("产品B");}
}

补充中。。。。。。

单例模式【懒汉式+饿汉式+枚举】相关推荐

  1. Spring框架学习day_01: 框架配置方式/ 管理对象的作用域/ 生命周期/ 组件扫描/ 单例模式:“懒汉式“,“饿汉式“

    1. Spring框架的作用 Spring框架的主要作用是创建对象和管理对象. 创建对象:类似于User user = new User(); 管理对象:随时可以通过Spring框架获取对象,甚至Sp ...

  2. 单例模式:饿汉式vs懒汉式

    单例模式是指,在代码运行时,保证某一个类只能被创建一个对象,不可以被创建第二次对象. 饿汉式: 1.先将类中的构造器私有化,用private修饰,防止在外界创建对象 例: private Test() ...

  3. 单例模式之饿汉式单例模式

    单例模式之饿汉式单例模式 单例模式三要素: 1.私有的静态属性,这主要是为了存储类唯一的实例 2.公共的静态方法,这主要是为了提供给外键生成获取单例的方法 3.用于限制类再次实例话的措施.一般会私有化 ...

  4. Java实现单例模式之饿汉式、懒汉式、枚举式,带测试。

    Java实现单例的3种普遍的模式,饿汉式.懒汉式.枚举式. 具体代码如下: package com.lcx.mode;/*** * 饿汉式单例,不管以后用不用这个对象,我们一开始就创建这个对象的实例, ...

  5. 单例模式:懒汉式 饿汉式 双检锁 登记式 枚举式 详细讲解

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对 ...

  6. java单例模式(饿汉式和懒汉式的几种不同写法)

    1.饿汉式(直接创建)三种创建方法代码里面都有 第三种静态代码块方式,需要创建个properties文件 package java2;import java.io.IOException; impor ...

  7. 单例模式之懒汉式/饿汉式/结合二者之优的模式

    单例模式主要用来产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例. 两个好处: 对于频繁使用的对象,可以省略new操作花费的时间 new的次数少了,对系统内存的使用频率就小了,那么GC压力 ...

  8. 单例模式(饿汉式和懒汉式)

    以前学习单例的时候,只理解了简单部分.这次看DRP,对单例的饿汉式和懒汉式有了一些认识和对比. 在实际的开发中,有些地方需要一个类只有一个实例.比如:网站在线人数的计数器,再比如IDE中的工具箱之类的 ...

  9. 设计模式——单例模式(饿汉式、懒汉式和DCL)

    所谓单例模式就是为了确保类在内存中只有一个对象,之所以会出现单例模式是因为,单例模式在系统内存中只存在一个对象,可以节约资源.当我们获得对象的时候,每次获得的都是同一个,那么我们可以先创建好一个实例, ...

最新文章

  1. 再见了月薪3w的大后端,低代码开发已成气候!
  2. SQL Server查询某字段在哪些表中
  3. 忘记mysql的root密码后,修改密码
  4. VS中使用define和undef实现条件编译(csc.exe条件编译)
  5. 在什么情况下自己应该辞职走人了,而不是等领导下“逐客令”?
  6. 59. Spiral Matrix Spiral Matrix II
  7. Docker网络实践运用
  8. SVN,HG,GIT 命令说明
  9. Mysql 给时间增加对应的时间
  10. 计算机丢失mscvr,教大家计算机丢失Msvcr100.dll的解决方法
  11. mysql 金额大写_小写转大写金额_MySQL
  12. 0504-android-云知声sdk使用
  13. AJAX聊天室实现原理 JQuery+PHP 【转】
  14. Tixati——BT下载软件
  15. python中怎么表示一个数的几次方
  16. 24V低压检测电路 - 低压检测电压
  17. 书是怎样写成的——《ASP.NET夜话》背后的故事
  18. 7-29 礼尚往来——错排
  19. python-电信宽带提速器软件
  20. java 生成json数据_解析和生成JSON数据

热门文章

  1. Python 操作 Rabbit MQ 发布/订阅 (五)
  2. poj1190 生日蛋糕 dfs
  3. testng+wiremock实现对外部系统接口的mock
  4. An Introduction to Shiro (formerly JSecurity) – A Beginner’s Tutorial Part 4
  5. 【调剂】合肥综合性国家科学中心人工智能研究院2021年硕士研究生招生预调剂公告...
  6. python中的pass是什么意思_python中的pass代表什么意思呢
  7. python根据输入的利润求奖金_【每日一练】巧用python实现利润计算
  8. 面试反杀「GitHub 热点速览 v.21.33」
  9. 【shell】linux输出重定向|输出重定向2>1
  10. 大数据的核心技术有?