设计模式

单例模式

 

开发中有很多类的对象我们只需要一个,例如虚拟机对象、任务管理器对象,对以上对象使用单例模式可以节约内存,提高性能

 

饿汉单例——通过类获取单例对象时,对象已经提前做好

懒汉单例—— 通过类获取单例对象的时候发现没有对象才会去创建一个对象

public class SingleInstanceDemo01 {
  public static void main(String[] args) {
        SingleInstance s1 = SingleInstance.getInstance();
        SingleInstance s2 = SingleInstance.getInstance();
        System.out.println(s1 == s2); // true
  }    
}    

// 饿汉单例设计一个单例模式的类
class SingleInstance01() {
  // 2. 定义一个静态成员变量用于存储一个对象(饿汉模式在返回对象时,对象要已经做好),  
  public static SingleInstance01 ins = new SingleInstance01();
  // 1. 把类的构造器私有,构造器只能在本类中访问!!
  private SingleInstance01() {
  }      
  // 3. 提供一个方法返回单例对象
  public static SingleInstance01 getInstance() {
        return ins;
  }      
}

// 懒汉单例设计一个单例模式的类
class SingleInstance02() {
    // 2. 定义一个静态成员变量用于存储一个对象(懒汉模式不能直接创建对象,必须需要的时候才创建)
    public static SingleInstance02 ins;
    
    // 1. 构造器私有
    private SingleInstance02() {
    }

    // 3. 通过方法返回一个对象,第一次不存在对象才创建一个返回
    public static SingleInstance02 getInstance() {
        if ( ins == null) {
            // 第一次取对象,创建一个对象
            ins = new SingleInstance02();
        }
        return ins;
    }
}

 

工厂模式

 

通常创建类对象时,都是使用new对象的形式创建,除new对象方式以外,工厂模式也可以创建对象

 

工厂设计模式的作用

  对象通过工厂的方法创建对象返回,工厂的方法可以为该对象进行加工和数据注入

  优点:可以实现类与类之间的解耦操作(核心思想,重点)

  缺点:工厂设计模式多了一个工厂类

 

装饰模式

装饰模式指的是在不改变原类,不使用继承的基础上,动态地拓展一个类的功能

 

思想:创建一个新类,包装原始类,从而在新类中提升原来类的功能

 

装饰模式实现原则

  1. 定义父类

  2. 定义原始类,继承父类,定义功能

  3. 定义装饰类,继承父类,包装原始类,增强功能

public abstract class InputStreamDemo {
    public abstract void read();
    public abstract void close();
}

public class FileInputStreamDemo extends InputStreamDemo{
    @Override
    public void read() {
        System.out.println("读取数据");
    }

    @Override
    public void close() {
        System.out.println("关闭流");
    }
}

public class BufferedInputStreamDemo extends InputStreamDemo{
    private InputStreamDemo is;
    public BufferedInputStreamDemo(InputStreamDemo is) {
        this.is = is;
    }

    @Override
    public void read() {
        System.out.println("开启搞冲缓冲读取");
        is.read();
    }

    @Override
    public void close() {
        is.close();
    }
}

public class Demo {
    public static void main(String[] args) {
        InputStreamDemo is = new BufferedInputStreamDemo(new FileInputStreamDemo());
        is.read();
        is.close();
    }
}

 

posted @ 2022-02-20 11:35  天叔  阅读(21)  评论(0编辑  收藏  举报