1、单例模式
(1)使用静态内部类来维护单例的实现:
懒汉模式,同时实现延迟加载和线程安全。静态内部类只有在第一次被使用的时候才会初始化。内部类里的静态变量保证线程安全。
当getInstance()第一次被调用的时候,第一次读取SingletonFactory.instance,导致SingletonFactory被初始化;当这个内部类初始化的时候,会初始化它的静态域,从而创建instance实例,由于是静态域,因此只会被jvm在装载类的时候初始化一次,由jvm保证了它的线程安全。
public class Singleton{ private Singleton(){} private static class SingletonFactory{ private static Singleton instance = new Singleton(): } public static Singleton getInstance(){ return SingletonFactory.instance; } }
(2)将创建类和getInstance()分开,单独为创建加synchronized关键字:
public class Singleton{ private static Singleton instance = null; private Singleton(){} private static synchronized void syncInit(){ if(instance==null){ instance = new Singleton(); } } public static Singleton getInstance(){ if(instance==null){ syncInit(); } return instance; } }
(3)使用枚举:
类构造器只能被一个线程在类加载的初始化阶段进行执行,所以枚举的每个实例在Java堆中有且只有一个副本。
public enum Singleton { INSTANCE;}
2、工厂模式
简单工厂模式:
public interface Sender{ public void Send(); } public class MailSender implements Sender{ public void Send(){ syso("mail sender"); } } public class SmsSender implements Sender{ public void send(){ syso("sms sender"); } } public class SendFactory{ // 普通工厂模式 public Sender produce(String type){ if("mail".equals(type)){ return new MailSender(); }else if("sms".equals(type)){ return new SmsSender(); } } // 静态工厂方法模式 public static Sender produceMail(){ return new MailSender(); } public static Sender produceSms(){ return new SmsSender(); } }
抽象工厂模式:
public interface Sender{ public void Send(); } public interface Provider{ public Sender produce(); } public class MailSender implements Sender{ public void Send(){ syso("mail sender"); } } public class SmsSender implements Sender{ public void send(){ syso("sms sender"); } } public class SendMailFactory implements Provider{ public Sender produce(){ return new MailSender(); } } public class SendSmsFactory implements Provider{ public Sender produce(){ return new SmsSender(); } }