设计模式


桥接模式(Bridge)

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

  • 关系图:

    将品牌和类型分开。

    1. 品牌接口
    public interface Brand {
        void info();
    }
    1. 实现品牌接口
    public class Apple implements Brand {
        @Override
        public void info() {
            System.out.print("苹果");
        }
    }
    
    public class Lenovo implements Brand {
        @Override
        public void info() {
            System.out.print("联想");
        }
    }
    
  1. 电脑类型抽象类

    public abstract class Computer {
     private Brand brand;
    
     public Computer(Brand brand) {
         this.brand = brand;
     }
     public void info(){
         brand.info();
     }
    }
  2. 继承电脑类型类

    class Desktop extends Computer{
    
     public Desktop(Brand brand) {
         super(brand);
     }
    
     @Override
     public void info() {
         super.info();
         System.out.print("台式机");
     }
    }
    class Laptop extends Computer{
    
     public Laptop(Brand brand) {
         super(brand);
     }
    
     @Override
     public void info() {
         super.info();
         System.out.print("笔记本");
     }
    }
  3. 测试类

    public class Test {
     public static void main(String[] args) {
         Computer computer =new Desktop(new Apple()) ;
         computer.info();
         Computer computer1=new Laptop(new Lenovo());
         computer1.info();
     }
    }
    //苹果台式机联想笔记本

单例模式

//饿汉模式
public class SingletonDemo1 {
    private  SingletonDemo1(){}

    private static SingletonDemo1 instance = new SingletonDemo1();

    public static  SingletonDemo1 getInstance(){
        return instance;
    }


}

//懒汉式
public class SingletonDemo2 {
    //私有化构造器
    private SingletonDemo2(){
    }
    //类初始化不立即加载该对象
    private  static SingletonDemo2 instance;
    // synchronized 效率低 //JVM 指令重排,某些线程获得未实例化对象
    public static synchronized SingletonDemo2 getInstance(){
        if (instance==null){
            instance = new SingletonDemo2();
        }
        return instance;
    }
}

// 双重检测/懒汉式
public class SingletonDemo3 {
    //
    private   SingletonDemo3(){

    }
    private volatile static  SingletonDemo3 instance; //voaltile() 排除JVM指令重排产生的影响
    public static  SingletonDemo3 getInstance(){
        if (instance==null){
            synchronized (SingletonDemo3.class){ //线程竞争锁
                if (instance==null){//竞争到后再判断对象是否实例化
                    instance=new SingletonDemo3();  //1.为 instance 分配内存空间
                                                    //1.初始化 instance
                                                    //3.将 instance 指向分配的内存地址
                }
            }
        }
        return instance;
    }
}

//静态内部类实现
public class SingletonDemo4 {
    private SingletonDemo4(){
    }

    private static class InnerClass{
        private static final SingletonDemo4 instance =new SingletonDemo4();
    }
    //延迟加载
    public static  SingletonDemo4 getInstance(){
        return InnerClass.instance;
    }

}

//枚举实现
public enum SingletonDemo5 {
    INSTANCE;
    public SingletonDemo5 getInstance(){
        return INSTANCE;
    }
}

Author: Maelsee
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Maelsee !
评论
 Previous
剑指offer算法题 剑指offer算法题
把数组排成最小的数 题目 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: "102" 分析 题目要求,数组中有m和n,如果m
2020-03-06
Next 
JDK,JRE,JVM JDK,JRE,JVM
JAVAJVM,JRE,JDK JVM 类加载子系统 运行时数据区 栈(线程) 栈的先进后出符合函数的调用顺序 局部变量表:存储函数体内的局部变量。 操作数栈:临时存储操作数,例如a=1,先将1压入操作数栈中,局部变量表中
2020-02-26 Maelsee
  TOC