java架构之路-(设计模式)五种创建型模式之单例模式
设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则。
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
其中包含
创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
我们今天就来说说我们的创建型模式
单例模式:是Java中最简单的设计模式之一。它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
用一种其它的方式来记忆吧,单例模式犹如我们吃的土豆,只有一个土豆,你叫他土豆也行,叫他马铃薯也可以,还可以叫Potato,但最终还是那一个土豆。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
代码实现:
饿汉式单例模式:
package Single;
public class CarBean {
public static CarBean carBean = new CarBean();
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//关闭构造方法.防止New对象
private CarBean() {
System.out.println("CarBean构造方法只走一次");
}
public static CarBean getInstance() {
return carBean;
}
}
package Single;
public class MainTest {
/**
* 饿汉式静态常量式单例模式
* 优点:这种写法在JVM装载类的时候就实例化了,避免了线程同步的问题
* 缺点:在类装载的时候就实例化,没有达到延时加载的效果,造成内存浪费
* @param args
*/
public static void main(String[] args) {
CarBean car1 = CarBean.getInstance();
CarBean car2 = CarBean.getInstance();
car1.setName("兰博基尼");
car2.setName("玛莎拉蒂");
System.out.println(car1.getName());
System.out.println(car2.getName());
}
}
懒汉式单例模式(非同步):
package Single2;
public class CarBean {
public static CarBean carBean = null;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//关闭构造方法.防止New对象
private CarBean() {
System.out.println("CarBean构造方法只走一次");
}
public static CarBean getInstance() {
if(carBean == null) {
carBean = new CarBean();
}
return carBean;
}
}
package Single2;
public class MainTest {
/**
* 懒汉式单例模式:非同步
* 优点:在调用的时候初始化该单例
* 缺点:并非线程同步,不建议使用
* @param args
*/
public static void main(String[] args) {
CarBean car1 = CarBean.getInstance();
CarBean car2 = CarBean.getInstance();
car1.setName("兰博基尼");
car2.setName("玛莎拉蒂");
System.out.println(car1.getName());
System.out.println(car2.getName());
}
}
懒汉式单例模式(同步):
package Single3;
public class CarBean {
public static CarBean carBean = null;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//关闭构造方法.防止New对象
private CarBean() {
System.out.println("CarBean构造方法只走一次");
}
/**
* 方法1
* 该方式使用synchronized同步锁将整个方法同步 实现线程同步 但同步整个方法在高并发的情况下会造成阻塞效率低下
* 不推荐使用
* @return
*/
public static synchronized CarBean getInstance1() {
if (carBean == null) {
carBean = new CarBean();
}
return carBean;
}
/**
* 方法2使用synchronized同步实例化改单例的代码块;但该方法不能完全实现同步,可能会产生多个实例;
* 例如:在第一次创建时多个线程同时进入if(lazySingleton == null) 则会产生多个实例
* 不推荐使用
* @return
*/
public static CarBean getInstance2() {
if (carBean == null) {
synchronized (CarBean.class) {
carBean = new CarBean();
}
}
return carBean;
}
/**
* 方法3:双重检查法,同步代码块中再次检查一次是否w为null解决了上述问题 推荐使用
*/
public static CarBean getInstance3() {
if (carBean == null) {
synchronized (CarBean.class) {
if (carBean == null) {
carBean = new CarBean();
}
}
}
return carBean;
}
}
里面具体的优缺点我都写在代码注释里了。
后面会把每一个模式都写一次。
最进弄了一个公众号,小菜技术,欢迎大家的加入

java架构之路-(设计模式)五种创建型模式之单例模式的更多相关文章
- NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)
创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...
- Java经典设计模式之五大创建型模式
转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...
- 设计模式GOF23(创建型模式)
• 创建型模式: 单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式. • 结构型模式: –适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式. • 行为型模式: 模 ...
- Java经典设计模式之五大创建型模式(附实例和详解)
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
- 初探Java设计模式1:创建型模式(工厂,单例等)
Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...
- Java设计模式之五大创建型模式(附实例和详解)
一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...
- .NET设计模式 第二部分 创建型模式(1)—:单件模式(Singleton Pattern)
单件模式(Singleton Pattern) ——.NET设计模式系列之二 Terrylee,2005年12月07日 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问 ...
- 设计模式(4)-对象创建型模式-Prototype模式
1.对象创建型模式 1.4 Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...
- C++ 设计模式 2:创建型模式
0 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活. 1 简单工厂模式 简单 ...
随机推荐
- 并发编程 Semaphore的使用和详解
类Semaphore的基本使用 Semaphore的作用:限制线程并发的数量 课外话题[多线程的同步概念]:其实就是排着队去执行一个任务,执行任务是一个一个的执行,这样的优点是有助于程序逻辑的正确性, ...
- C++责任链
#include <iostream> using namespace std; class Base{ protected: Base *next; public: Base(Base ...
- jvm系列(五):Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...
- JVM宏观认知&&内存结构
JVM宏观认知 1.什么是虚拟机? 虚拟机是一种软件. 可分为系统虚拟机(仿真物理机)和程序虚拟机(执行单个计算机程序,比如JVM). 2.什么是Java虚拟机(JVM)? JVM是一种将字节码转化为 ...
- JS之clientWidth、offsetWidth等属性介绍
一.clientXXX 属性 代码演示 // css 部分 <style> .test{ width:100px; height:100px; border:1px solid red; ...
- FineReport - 项目连接Oracle数据库
FineReport项目连接Oracle数据库 1:打开模板设计器,单击[服务器],选择[定义数据连接]: 2:单击[+],选择[JDBC]; 3:数据库选择[Oracle],驱动器选择[oracle ...
- Joda学习笔记
Joda Time简介 日常业务开发中,经常需要处理日期.比如:获取当前一个月之内的开播记录,获取十分钟之内的红包记录等等.我们之前是用java.util.Calendar实现的,直到我看到占小 ...
- [翻译] .NET Core 3.0 Preview 9 发布
原文: Announcing .NET Core 3.0 Preview 9 今天,我们宣布推出 .NET Core 3.0 Preview 9.就像 Preview 8 一样,我们专注于打磨 .NE ...
- JMeter更改语言为英文
1. 进入目录apache-jmeter-2.13\bin 2. 打开jmeter.properties 3. 取消“language=en”前的注释 4. 重新打开JMeter,即可看到语言已经变成 ...
- 牛客 136G-指纹锁 set容器重载
136G-指纹锁 题意: 设计一个容器,支持插入x,若与容器中的值最小相差为k,则自动忽略.删除操作,把与x相差为k的值都从容器中删除.查询操作,问容器中有没有和x相差为k的数值. 思路: 一个stl ...