这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决:一个全局使用的类频繁地创建与销毁。 举例:操作一个文件,应该用一个唯一的实例去操作。
当使用的时候再实例化,节省空间。 加上synchronized锁保证线程安全。
public class Singleton { private static Singleton instance; private Singleton (){ } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
当加载类的时候就实例化,浪费空间。 不用加synchronized锁,效率更高。
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){ } public static Singleton getInstance() { return instance; } }
工厂类模式设计的核心是:让“生产”和“产品”解耦。
工厂模式的主要解决的问题是,将原来分布在各个地方的对象创建过程单独抽离出来,交给工厂类负责创建。其他地方想要使用对象直接找工厂(即调用工厂的方法)获取对象。 优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
public class TeaFactory { public ITea createTea(String type){ ITea tea = null; if(type.equals("longjing")){ tea = new LongjingTea(); }else if(type.equals("biluochun")){ tea = new BiluochunTea(); } if(tea != null){ tea.makeTea(); } return tea; } } class Solution{ public static void main(String[] args) { TeaFactory teaFactory = new TeaFactory(); ITea tea = teaFactory.createTea("longjing"); } }
如果要创建的产品类型较多,且各个产品创建的过程不尽相同,则一个工厂类职责会变得越来越多,不符合单一职责原则。另外简单工厂也不符合开闭原则。要新增一种产品需要修改原来的工厂类。
工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
public interface ITeaFactory { // 生产茶叶 public ITea createTea(); }
public class LongjingTeaFactory implements ITeaFactory{ @Override public ITea createTea() { return new LongjingTea(); } } public class BiluochunTeaFactory implements ITeaFactory{ @Override public ITea createTea() { return new BiluochunTea(); } }
public class FactoryMethodTest { public static void main(String[] args) { ITeaFactory factory = new LongjingTeaFactory(); factory.createTea(); factory = new BiluochunTeaFactory(); factory.createTea(); } }
1.简单工厂模式:一个工厂里可以生产所有产品,根据传入的参数选择生产哪种产品。 2.工厂模式:有多个工厂,每个工厂只生产一种产品。 3.抽象工厂模式:有多个工厂,每个工厂都能生产多个产品,它们是一个品牌。