ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 1、设计模式 ### 1.1 单例模式 * ##### **饿汉式【可用】** ~~~ public class Singleton { private static final Singleton INSTANCE = new Singleton(); // 构造方法私有化 private Singleton(){} public static Singleton getInstance(){ return INSTANCE; } } ~~~ 优点:简单、线程安全 缺点:非懒加载模式,在类加载时进行初始化,如果自始至终都没有使用过该对象,那么就造成了内存的浪费 * ##### **懒汉式【不推荐使用】** ~~~ public class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; } } ~~~ 优点:使用了懒加载的模式,在第一次使用该对象时实例化该对象 缺点:线程不安全,在单线程中可使用,多线程中无效 * ##### 懒汉改进式【不推荐使用】 * ~~~ public class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ synchronized (Singleton.class){ if (instance == null){ instance = new Singleton(); } return instance; } } } ~~~ 优点:在使用懒加载的基础上实现了线程安全 缺点:每次获取对象时多需要进行加锁,效率比较低。 * ##### 双重校验锁【推荐使用】 * ~~~ public class Singleton { private static Singleton INSTANCE = null; private Singleton(){} public static Singleton getInstance(){ if (INSTANCE == null){ synchronized (Singleton.class){ if (INSTANCE == null){ INSTANCE = new Singleton(); } } } return INSTANCE; } } ~~~ 优点:只在第一次调用时加锁,之后直接返回对象实例。**延迟加载、线程安全、效率较高** * **静态内部类【推荐使用】** ~~~ public class Singleton{ private Singleton(){} private static class SingleObject{ private static Singleton INSTANCE = new Singleton(); } public static Singleton getInstance(){ return SingleObject.INSTANCE; } } ~~~ 优点:线程安全、延迟加载、效率较高。 (静态内部类在第一次调用时进行加载,实现了延时加载;INSTANCE是一个静态变量,JVM在实例化时保证了变量的唯一和线程安全) * ##### 枚举【推荐使用】 ~~~ public enum Singleton{ INSTANCE; Singleton(){} } ~~~ 优点:系统内存中只存在一个实例对象,节省了系统资源 缺点:当想要实例化一个对象时,需要记住相应的方法,而不是new XXX(),会给其他开发者造成困扰,特别是在看不到源码的情况下。 ### 1.2 工厂模式 ~~~ public abstract class Sender{ abstract void send(); } public class SMSSender extends Sender{ @Override public void send() { System.out.println("This is SMS Sender"); } } public class MailSender extends Sender{ @Override void send() { System.out.println("This is Email Sender"); } } ~~~ * ##### 简单工厂模式 ~~~ public class SimpleFactory { public Sender getSender(String senderType){ switch (senderType){ case "sms": return new SMSSender(); case "mail": return new MailSender(); default: return null; } } public static void main(String[] args) { Sender sender = new SimpleFactory().getSender("sms"); sender.send(); } } ~~~ 缺点:如果传递的字符串错误,则不能正确的创建对象 * 静态工厂方法模式 ~~~ public class StaticMethodFactory { public static Sender getSMSSender(){ return new SMSSender(); } public static Sender getMailSender(){ return new MailSender(); } public static void main(String[] args) { Sender sender = StaticMethodFactory.getMailSender(); sender.send(); } } ~~~ 缺点:如果需要新增一个WXSender,则需要重新对Factory进行增添和补充,违反了闭包原则 * 抽象工厂模式  在简单工厂模式和工厂方法模式中,工厂的功能比较单一(只能生产Sender),而在抽象工厂方法中,工厂中可以有多个方法(生产Sender、Provider等)。如 ~~~ public interface Provider { Sender produce(); } public class MailSenderProvider implements Provider { @Override public Sender produce() { return new MailSender(); } } public class SMSSenderProvider implements Provider { @Override public Sender produce() { return new SMSSender(); } } public class AbstractFactory { public static void main(String[] args) { Provider provider = new SMSSenderProvider(); Sender sender = provider.produce(); sender.send(); } } ~~~ > 设计模式代码产出:[http://git.sankuai.com/users/duoshilin/repos/android-practices/browse/java\_design\_patter](http://git.sankuai.com/users/duoshilin/repos/android-practices/browse/java_design_patter "http://git.sankuai.com/users/duoshilin/repos/android-practices/browse/java_design_patter") > > 设计模式参考文章:[http://www.runoob.com/design-pattern/abstract-factory-pattern.html](http://www.runoob.com/design-pattern/abstract-factory-pattern.html "http://www.runoob.com/design-pattern/abstract-factory-pattern.html")