通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
具体实现
立即加载就是使用类的时候已经将对象创建完毕(不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故又被称为“饿汉模式”),常见的实现办法就是直接new实例化。
public class Singleton { // 将自身实例化对象设置为一个属性,并用static、final修饰 private static final Singleton instance = new Singleton(); // 构造方法私有化 private Singleton() {} // 静态方法返回该实例 public static Singleton getInstance() { return instance; } }
缺点:当类被加载的时候,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例)。
延迟加载就是调用get()方法时实例才被创建(先不急着实例化出对象,等要用的时候才给你创建出来。不着急,故又称为“懒汉模式”),常见的实现方法就是在get方法中进行new实例化。
public class Singleton { // 将自身实例化对象设置为一个属性,并用static修饰 private static Singleton instance; // 构造方法私有化 private Singleton() {} // 静态方法返回该实例 public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }
缺点:在多线程环境中,这种实现方法是完全错误的,根本不能保证单例的状态。
public class Singleton { // 将自身实例化对象设置为一个属性,并用static修饰 private static Singleton instance; // 构造方法私有化 private Singleton() {} // 静态方法返回该实例,加synchronized关键字实现同步 public static synchronized Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }
缺点:众所周知在多线程情形下,synchronized方法通常效率低,显然这不是最佳的实现方案。
public class Singleton { // 将自身实例化对象设置为一个属性,并用static修饰 private static Singleton instance; // 构造方法私有化 private Singleton() {} // 静态方法返回该实例 public static Singleton getInstance() { // 第一次检查instance是否被实例化出来,如果没有进入if块 if(instance == null) { synchronized (Singleton.class) { // 某个线程取得了类锁,实例化对象前第二次检查instance //是否已经被实例化出来,如果没有,才最终实例出对象 if (instance == null) { instance = new Singleton(); } } } return instance; } }
方法四算是单例模式的最佳实现方式。内存占用率高,效率高,线程安全,多线程操作原子性。
工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。
该模式用于封装和管理对象的创建,是一种创建型模式。
该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象。
public interface Phone { void make(); } //小米手机类 public class MiPhone implements Phone { public MiPhone() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("make xiaomi phone!"); } } //苹果手机类 public class IPhone implements Phone { public IPhone() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("make iphone!"); } } //类的实例化工厂 //注意,并没有特意修改手机工厂的构造器! public class PhoneFactory { public Phone makePhone(String phoneType) { if(phoneType.equalsIgnoreCase("MiPhone")){ return new MiPhone(); } else if(phoneType.equalsIgnoreCase("iPhone")) { return new IPhone(); } return null; } } public class Demo { public static void main(String[] arg) { PhoneFactory factory = new PhoneFactory(); Phone miPhone = factory.makePhone("MiPhone"); // make xiaomi phone! IPhone iPhone = (IPhone)factory.makePhone("iPhone");// make iphone! } }
缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反高内聚的责任分配原则
和简单工厂模式中一个工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。
AbstractFactory类:生产不同产品的工厂的抽象类
public interface AbstractFactory { Phone makePhone(); }
XiaoMiFactory类:生产小米手机的工厂(ConcreteFactory1)
public class XiaoMiFactory implements AbstractFactory{ @Override public Phone makePhone() { return new MiPhone(); } }
AppleFactory类:生产苹果手机的工厂(ConcreteFactory2)
public class AppleFactory implements AbstractFactory { @Override public Phone makePhone() { return new IPhone(); } }
演示:
public class Demo { public static void main(String[] arg) { AbstractFactory miFactory = new XiaoMiFactory(); AbstractFactory appleFactory = new AppleFactory(); miFactory.makePhone(); // make xiaomi phone! appleFactory.makePhone(); // make iphone! } }
优点:
缺点:
上面两种模式不管工厂怎么拆分抽象,都只是针对一类产品Phone(AbstractProduct),如果要生成另一种产品PC,应该怎么表示呢?
最简单的方式是把2中介绍的工厂方法模式完全复制一份,不过这次生产的是PC。但同时也就意味着我们要完全复制和修改Phone生产管理的所有代码,显然这是一个笨办法,并不利于扩展和维护。
抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。
PC类:定义PC产品的接口(AbstractPC)
public interface PC { void make(); }
MiPC类:定义小米电脑产品(MIPC)
public class MiPC implements PC { public MiPC() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("make xiaomi PC!"); } }
MAC类:定义苹果电脑产品(MAC)
public class MAC implements PC { public MAC() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("make MAC!"); } }
下面需要修改工厂相关的类的定义:
AbstractFactory类:增加PC产品制造接口
public interface AbstractFactory { Phone makePhone(); PC makePC(); }
XiaoMiFactory类:增加小米PC的制造(ConcreteFactory1)
public class XiaoMiFactory implements AbstractFactory{ @Override public Phone makePhone() { return new MiPhone(); } @Override public PC makePC() { return new MiPC(); } }
AppleFactory类:增加苹果PC的制造(ConcreteFactory2)
public class AppleFactory implements AbstractFactory { @Override public Phone makePhone() { return new IPhone(); } @Override public PC makePC() { return new MAC(); } }
演示:
public class Demo { public static void main(String[] arg) { AbstractFactory miFactory = new XiaoMiFactory(); AbstractFactory appleFactory = new AppleFactory(); miFactory.makePhone(); // make xiaomi phone! miFactory.makePC(); // make xiaomi PC! appleFactory.makePhone(); // make iphone! appleFactory.makePC(); // make MAC! } }
优点:
缺点: