Define an interface for creating an object, but let sub let subclasses decide which class to instantiate Factory Methods lets a class defer instantiation to subclasses(定義一個用戶建立對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化到其實例)ide
工廠模式類圖
1.抽象產品類spa
public abstract class Product { //產品類的公共方法 public void method1(){ //業務邏輯處理 } //抽象方法 public abstract void method2(); }
2.具體產品類code
public class ConcreateProduct1 extends Product { public void method2() { //業務邏輯處理 } } public class ConcreteProduct2 extends Product { public void method2(){ } }
3.抽象工廠類對象
public abstract class Creator { //建立一個產品對象,其輸入參數能夠自行設置 //一般爲String、Enum、Class等,固然也能夠爲空 public abstract <T entends Product> T createProduct(Class<T> c) }
4.具體工廠類接口
public class ConcreteCreator extends Creator { public <T extends Product> T createProduct(Class<T> c){ Product product = null; try{ product = (Product)Class.forName(c.getName()).newInstance(); }catch(Exception e){ //異常處理 } return (T)product; } }
5.場景類ci
public class Client { public static void main(String[] args){ Creator creator = new ConcreteCreator(); Product product = creator.createProduct(ConcreteProduct1.class); //繼續業務處理 } }
將抽象工廠類剔除,將具體工廠類的建立產品的方法變爲靜態get
不一樣的產品將由不一樣的工廠類建立產品
1.單例類io
public class Singleton { //不容許經過new產生一個對象 private Singleton() { } public void doSomething() { //業務處理 } }
2.負責生成單例的工廠類class
public class SingletonFactory { private static Singleton signleton; static{ try{ Class c1 = Class.forName(Singleton.class.getName()); //得到無參構造 Constructor constructor = c1.getDeclaredConstructor(); //設置無參構造是可訪問的 constructor.setAccessible(true); //產生一個實例對象 singleton = (Singleton)constructor.newInstance(); }catch (Exception e){ //異常處理 } } public static Singleton getSingleton(){ return singleton; } }