zoukankan      html  css  js  c++  java
  • 设计模式

    1,概述:

    设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用

    2,创建型模式

    2.1,单例模式:

    • 确保一个类只有一个实例,并提供该类的全局访问点。

    ①懒汉式--线程不安全

    public class Singleton {
    private static Singleton uniqueInstance;
    private Singleton() {
    }
    public static Singleton getUniqueInstance() {
    if (uniqueInstance == null) {
    uniqueInstance = new Singleton();
    }
    return uniqueInstance;
    }
    }

    懒汉:到用的时候才实例化(类未调用,不用实例化)--延迟实例化,节省空间。

    问题:如果同时有几个线程进入if语句块,则将会被实例化几次。

    ②饿汉式--线程安全,

    public class Singleton {
    private static Singleton uniqueInstance= new Singleton();
    private Singleton() {
    }
    public static Singleton getUniqueInstance() {
    return uniqueInstance;
    }
    }

    饿汉:先吃再说,先实例化,用了直接拿;

    问题:避免了线程不安全导致的多次实例化,但也丢失了延迟实例化带来节约资源的好处。

    ③懒汉式--线程安全

    public class Singleton {
    private static Singleton uniqueInstance;
    private Singleton() {
    }
    public static synchronized Singleton getUniqueInstance() {
    if (uniqueInstance == null) {
    uniqueInstance = new Singleton();
    }
    return uniqueInstance;
    }
    }

    只需要对,getUniqueInstance() 方法加锁,就只有一个线程能进入实例化代码块了。

    问题:线程抢锁导致阻塞问题,性能不高。

    双重校验锁--线程安全

    因为单例对象只需要实例化一次,解决③性能问题只需将锁加在实例化代码块上。

    public class Singleton {
    private volatile static Singleton uniqueInstance;                    ----volatile通过禁止指令重排序,保证多线程下正常运行。
    private Singleton() {
    }
    public static Singleton getUniqueInstance() {
    if (uniqueInstance == null) {
    synchronized(Singleton.class){
    if(uniqueInstance == null)                                   ----双重校验,防止延迟实例化导致多次实例化问题
    uniqueInstance = new Singleton();
    }
    }
    return uniqueInstance;
    }
    }

    ⑤静态内部类实现

    当Singleton类加载时,静态内部类SingletonHolder并没有被加载进内存。当调用getUniqueInstance()方法

    访问SingletonHolder.INSTANCE 时触发SingletonHolder 类加载。且JVM保证线程安全和保证INSTANCE只被实例化一次。

    public class Singleton {
    private Singleton() {
    }
    private static class SingletonHolder {
    private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getUniqueInstance() {
    return SingletonHolder.INSTANCE;
    }
    }

    ⑥枚举类实现

    public enum Singleton {
    INSTANCE;
    private String objName;
    public String getObjName() {
    return objName;
    }
    public void setObjName(String objName) {
    this.objName = objName;
    }
    }
     
    2.2,简单工厂模式:
    • 在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。
    • 简单工厂把实例化操作单独放到一个类中,称为简单工厂类,让简单工厂决定实例化哪个子类。如子类改变了,

    修改简单工厂类而不用修改客户端。

     

    2.3,工厂方法:

    • 定义了一个创建对象的接口,但由子类决定要实例化哪个类,工厂方法把实例化操作推迟到子类

    2.4,抽象工厂:

    • 提供一个接口,用于创建相关的对象家族。

    3,结构性模式:

    3.1,适配器模式:

    • 把一个类接口转换成另一个用户需要的接口。

    3.2,桥接模式:

    • 将抽象与实现分离开来,使他们可以独立变化。

     3.3,装饰者模式:JAVA设计模式初探之装饰者模式

    • 为对象动态添加功能
    • 装饰者(如:FilterIputStream)与具体组件(如:FileInputStream---BufferedInputStream)都继承至组件(InputStream)

    具体组件的方法实现不需要依赖其他对象,而装饰者组合了一个组件,这样可以装饰一个组件,

    所谓装饰即扩展被装饰者的功能。

    • 例如实例化一个具有缓冲功能的字节流对象,只需要在FileInputStream对象再套一次BufferedInputStream对象即可

     FileInputStream file=new FileInputStream(filePath);

    BufferedInputStream bufferInputStream =new BufferedInputStream(file);

    参考:

    https://www.cnblogs.com/pony1223/p/7608955.html

  • 相关阅读:
    获取 鼠标 键盘 最后响应信息
    EF 6 for mysql
    Python中的OS模块。
    python中的随机函数random的用法示例random
    Python中OSI七层模型
    Pythoon中的面向对象三大特征
    Python中的函数(学习日记)
    Python的6种运算符(日记)
    计算机的发展史
    osi七层
  • 原文地址:https://www.cnblogs.com/wangpan8721/p/13909750.html
Copyright © 2011-2022 走看看