首页 > 其他分享 >设计模式

设计模式

时间:2022-11-05 07:11:06浏览次数:76  
标签:Singleton 建造 模式 instance 线程 设计模式 public

原型模式(Prototype)

原型模式是一种创建型模式,它允许一个对象再创建另外一个可定制的对象,根本无需知道创建的细节。当直接创建对象的代价比较大时,则采用这种模式。

在Java中Prototype模式变成clone()方法的使用,由于Java的面向对象特性,使得在Java中使用原型模式变得很自然,两者已经几乎是浑然一体了。这反映在很多模式上,如Iterator遍历模式。

实现方法:

  1. 必须让布标类实现Cloneable接口
  2. 必须重写Object的clone方法,并且要把重写后的方法的访问控制修饰符改为public
public class MilkTea implements Cloneable {
    public String type;
    public boolean ice;

    // 这种方式是浅拷贝
    public MilkTea clone() throws CloneNotSupportedException {
        return (MilkTea) super.clone();
    }
}

这种模式要分清对象的浅拷贝与深拷贝。

建造者模式(Builder)

建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。说白了就是,将一个相似的构建对象的过程抽象出来,达到代码复用和可扩展的功能。

在这种设计模式中,有以下几个角色:

  1. builder,为创建一个产品对象的各个部件指定接口(指定建造标准,稳定建造流程)
  2. ConcreteBuilder:实现builder接口的具体建造者
  3. Director:构造一个使用builder接口的对象。它就是指导者,由他封装建造的过程。
  4. Product:具体的产品,被构建的对象。

扩展:建造者模式在使用过程中可以演化出多种形式

省略抽象建造者角色:如果系统中只需要一个具体的建造者的话,可以省略掉抽象建造者

省略指导者角色:在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色,让Builder自己扮演指导者和建造者双重角色

builder-uml
builder-uml

建造者与工厂模式的区别在于,工厂模式只需要新建出 一个产品即可,即new出一个对象;而建造者模式更注重产品新建出来后,为产品属性赋值的过程,它强调的是构建过程。

单例模式(Singleton)

单例模式确保一个类只有一个实例,并提供一个全局访问点。

饿汉式

变量在申明时即被初始化。

public class Singleton {
    private static Singleton instance = new Singleton();

    public static Singleton getInstance() {
        return instance;
    }

    private Singleton() { }
}   

优点:线程安全;直观

缺点:增加类初始化时间,类即使不使用,也会被实例化

懒汉式

先声明一个空变量,需要用时才初始化

方式一:双检锁方式实现的线程安全的单例模式,别漏掉volatile

public class Singleton {
    private static volatile Singleton instance = null;

    public static Singleton getInstance() {
        if (instance == null) {
             synchronized (Singleton.class) {
                 if (instance == null) {
                     instance = new Singleton();
                 }
            }
        }
         return instance;
    }

    private Singleton() { }
}

方式二:静态内部类方式保证懒汉式单例的线程安全

public class Singleton {
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }

    private static class SingletonHolder {
        public static Singleton instance = new Singleton();
    }

    private Singleton() { }

为什么这种方式能保证线程安全?来分析两个问题:

  • 静态内部类方式是怎么实现懒加载的
  • 静态内部类方式是怎么保证线程安全的

类在初始化的时候,会立即加载内部类,内部类会在使用时才加载。所以当此 Singleton 类加载时,SingletonHolder 并不会被立即加载,所以不会像饿汉式那样占用内存。另外,Java 虚拟机规定,当访问一个类的静态字段时,如果该类尚未初始化,则立即初始化此类。当调用Singleton 的 getInstance 方法时,由于其使用了 SingletonHolder 的静态变量instance,所以这时才会去初始化 SingletonHolder,在 SingletonHolder 中 new 出 Singleton 对象。这就实现了懒加载。

其次,虚拟机在加载类的 clinit 方法时,会保证 clinit 在多线程中被正确的加锁、同步,即使有多个线程同时去初始化一个类,一次也只有一个线程可以执行 clinit 方法,其他线程都需要阻塞等待,从而保证了线程安全。

如何权衡两种方式?一般的建议是:对于构建不复杂,加载完成后会立即使用的单例对象,推荐使用饿汉式。对于构建过程耗时较长,并不是所有使用此类都会用到的单例对象,推荐使用懒汉式。

标签:Singleton,建造,模式,instance,线程,设计模式,public
From: https://www.cnblogs.com/cloudrich/p/16859593.html

相关文章

  • 【设计模式】中介者模式(行为设计模式)
    对于中介者,任谁一听都想到了房产中介,然而房产中介的职责和这个中介者模式的职责很类似,就是在买房和卖房之间建立一个桥梁通讯(当然了,我们这个不收费O(∩_∩)O)中介者模式的......
  • 行为型设计模式之访问者模式
    访问者模式访问者模式属于行为型模式。它是一种将数据结构与数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定......
  • 初识设计模式 - 备忘录模式
    简介备忘录设计模式(MementoDesignPattern)也叫作快照(Snapshot)模式,主要用于实现防丢失、撤销、恢复等功能。其定义是,在不违背封装原则的前提下,捕获一个对象的内部状态,并......
  • 设计模式:责任链模式的应用场景及源码应用
    一、概述责任链模式(ChainofResponsibilityPattern)是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首......
  • 浅谈PHP设计模式的适配器模式
    简介:适配器模式属于结构型设计模式。将一个类的接口转换成可应用的兼容接口。适配器使原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有两种实现方......
  • 【设计模式】适配器模式
    适配器模式的意图将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作(就是把接口不兼容的问题抹平,但不......
  • 设计模式之结构型模式
    目录一、适配器模式二、装饰器模式三、代理模式四、外观模式五、享元模式六、桥接模式七、组合模式创建型模式(5个)工厂方法模式、抽象工厂模式、单例模式、建造者模式、原......
  • 设计模式之代理,手动实现动态代理,揭秘原理实现
    开心一刻周末,带着老婆儿子一起逛公园。儿子一个人跑在前面,吧唧一下不小心摔了一跤,脑袋瓜子摔了个包,稀里哗啦的哭道:“爸爸,我会不会摔成傻子!”我指了指我头上的伤痕安......
  • 设计模式十三(数据访问对象模式,前端控制器模式)
    数据访问对象模式(DataAccessObjectPattern)或DAO模式用于把低级的数据访问API或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。数据访问对象......
  • 设计模式之代理模式
    概述代理模式是一种应用很广泛的结构型设计模式,而且变化很多。在代理模式中引入了一个新的代理对象,代理对象可以在客户端对象和目标对象之间起到中介的作用,去掉客户不能看......