本文主要是介绍抽丝剥茧设计模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Singleton 单例
饿汉式
最简单的方式
/*** 饿汉式* 类加载到内存后,就实例化一个单例,JVM保证线程安全* 简单实用,推荐使用!* 唯一缺点:不管用到与否,类装载时就完成实例化* Class.forName("")* (话说你不用的,你装载它干啥)*/
public class Mgr01 {private static final Mgr01 INSTANCE = new Mgr01();private Mgr01() {};public static Mgr01 getInstance() {return INSTANCE;}public void m() {System.out.println("m");}public static void main(String[] args) {Mgr01 m1 = Mgr01.getInstance();Mgr01 m2 = Mgr01.getInstance();System.out.println(m1 == m2);//true}
}
双重检测锁
/*** lazy loading* 也称懒汉式* 虽然达到了按需初始化的目的,但却带来线程不安全的问题* 可以通过synchronized解决,但也带来效率下降*/
public class Mgr06 {private static volatile Mgr06 INSTANCE; //JITprivate Mgr06() {}public static Mgr06 getInstance() {if (INSTANCE == null) {//双重检查synchronized (Mgr06.class) {if(INSTANCE == null) {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}INSTANCE = new Mgr06();}}}return INSTANCE;}public void m() {System.out.println("m");}public static void main(String[] args) {for(int i=0; i<100; i++) {new Thread(()->{System.out.println(Mgr06.getInstance().hashCode());}).start();}}
}
静态内部类
/*** 静态内部类方式* JVM保证单例* 加载外部类时不会加载内部类,这样可以实现懒加载*/
public class Mgr07 {private Mgr07() {}private static class Mgr07Holder {private final static Mgr07 INSTANCE = new Mgr07();}public static Mgr07 getInstance() {return Mgr07Holder.INSTANCE;}public void m() {System.out.println("m");}public static void main(String[] args) {for(int i=0; i<100; i++) {new Thread(()->{System.out.println(Mgr07.getInstance().hashCode());}).start();}}
}
枚举方式
/*** 不仅可以解决线程同步,还可以防止反序列化。*/
public enum Mgr08 {INSTANCE;public void m() {}public static void main(String[] args) {for(int i=0; i<100; i++) {new Thread(()->{System.out.println(Mgr08.INSTANCE.hashCode());}).start();}}
}
Strategy 策略
比较猫的属性排序
public class CatHeightComparator implements Comparator<Cat> {@Overridepublic int compare(Cat o1, Cat o2) {if(o1.height > o2.height) return -1;else if (o1.height < o2.height) return 1;else return 0;}
}
这篇关于抽丝剥茧设计模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!