设计模式之单例模式

一、什么是设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。简单说:

模式:在某些场景下,针对某类问题的某种通用的解决方案。

场景:项目所在的环境

问题:约束条件,项目目标等

解决方案:通用、可复用的设计,解决约束达到目标。

二、设计模式的三个分类

创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。

结构型模式:把类或对象结合在一起形成一个更大的结构。

行为型模式:类和对象如何交互,及划分责任和算法。

如下图所示:
在这里插入图片描述
创建型:
单例模式:https://blog.csdn.net/Platinum_stars/article/details/108284748
结构型:
代理模式:https://blog.csdn.net/Platinum_stars/article/details/108284483
行为型:
模板模式:https://blog.csdn.net/Platinum_stars/article/details/108284889
单例模式

单例模式:某个类只能有一个实例,提供一个全局的访问点。

单例模式,它的定义就是确保某一个类只有一个实例,并且提供一个全局访问点。

单例模式具备典型的3个特点:1、只有一个实例。 2、自我实例化。 3、提供全局访问点。

因此当系统中只需要一个实例对象或者系统中只允许一个公共访问点,除了这个公共访问点外,不能通过其他访问点访问该实例时,可以使用单例模式。

单例模式的主要优点就是节约系统资源、提高了系统效率,同时也能够严格控制客户对它的访问。也许就是因为系统中只有一个实例,这样就导致了单例类的职责过重,违背了“单一职责原则”,同时也没有抽象类,所以扩展起来有一定的困难。其UML结构图非常简单,就只有一个类,如下图:
在这里插入图片描述

懒汉式存在线程安全问题,需要加锁

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 单例设计模式
 * @author Ankang Huang
 * @date 2020-08-18
 */
public class SingleTest {
    public static void main(String[] args) {
        Blank blank = Blank.getInstance();
        Blank blank2 = Blank.getInstance();
        System.out.println(blank == blank2);
        Order order = Order.getInstance();
        Order order2 = Order.getInstance();
        System.out.println(order == order2);
    }
}

//饿汉式
class Blank {
    //私有化构造器
    private Blank() {
    }

    //创建内部对象
    private static Blank instance = new Blank();

    //提供公共静态方法
    public static Blank getInstance() {
        return instance;
    }

}

//懒汉式
class Order {
    //私有化构造器
    private Order() {
    }

    //创建内部对象
    private static Order instance;
    private static Lock lock = new ReentrantLock();

    //提供公共静态方法
    public static Order getInstance() {
        if (instance == null){
            try {
                if (lock.tryLock(10, TimeUnit.MICROSECONDS) && instance == null) {
                    instance = new Order();
                    lock.unlock();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return instance;
    }

}

本文链接:https://blog.csdn.net/Platinum_stars/article/details/108284748

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值