Java設計模式之工廠模式
工廠方法模式
工廠方法模式分為三種:普通工廠模式、多個工廠方法模式和靜態工廠方法模式。
1、普通工廠模式
普通工廠模式就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建。
package com.mode.create; public interface MyInterface { public void print(); }
package com.mode.create; public class MyClassOne implements MyInterface { @Override publicvoid print() { System.out.println("MyClassOne"); } }
package com.mode.create; public class MyClassTwo implements MyInterface { @Override public void print() { System.out.println("MyClassTwo"); } }
package com.mode.create; public class MyFactory {public MyInterface produce(String type) { if ("One".equals(type)) { return new MyClassOne(); } else if ("Two".equals(type)) { return new MyClassTwo(); } else { System.out.println("沒有要找的類型"); return null; } } }
package com.mode.create;
public class FactoryTest { public static void main(String[] args){ MyFactory factory = new MyFactory(); MyInterface myi = factory.produce("One"); myi.print(); } }
FactoryTest的運行結果我想應該很明顯了。
再回頭來理解這句話:普通工廠模式就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建。
3.1.2、多個工廠方法模式
多個工廠方法模式,是對普通工廠方法模式的改進,多個工廠方法模式就是提供多個工廠方法,分別創建對象。
直接看代碼吧,我們修改MyFactory和FactoryTest如下:
package com.mode.create; public class MyFactory { public MyInterface produceOne() { return new MyClassOne(); } public MyInterface produceTwo() { return new MyClassTwo(); } }
package com.mode.create; public class FactoryTest { public static void main(String[] args){ MyFactory factory = new MyFactory(); MyInterface myi = factory.produceOne(); myi.print(); } }
運行結果也是十分明顯了。
再回頭來理解這句話:多個工廠方法模式,是對普通工廠方法模式的改進,多個工廠方法模式就是提供多個工廠方法,分別創建對象。
3.1.3、靜態工廠方法模式
靜態工廠方法模式,將上面的多個工廠方法模式裏的方法置為靜態的,不需要創建實例,直接調用即可。
直接看代碼吧,我們修改MyFactory和FactoryTest如下:
package com.mode.create; public class MyFactory { public static MyInterface produceOne() { return new MyClassOne(); } public static MyInterface produceTwo() { return new MyClassTwo(); } }
package com.mode.create; public class FactoryTest { public static void main(String[] args){ MyInterface myi = MyFactory.produceOne(); myi.print(); } }
運行結果依舊很明顯。
再回顧:靜態工廠方法模式,將上面的多個工廠方法模式裏的方法置為靜態的,不需要創建實例,直接調用即可。
3.2、抽象工廠模式
工廠方法模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須對工廠類進行修改,這違背了閉包原則。
為解決這個問題,我們來看看抽象工廠模式:創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。
這樣就符合閉包原則了。
下面來看看代碼:
MyInterface、MyClassOne、MyClassTwo不變。
新增如下接口和類:
package com.mode.create; public interface Provider { public MyInterface produce(); }
package com.mode.create; public class MyFactoryOne implements Provider { @Override public MyInterface produce() { return new MyClassOne(); } }
package com.mode.create; public class MyFactoryTwo implements Provider { @Override public MyInterface produce() { return new MyClassTwo(); } }
修改測試類FactoryTest如下:
package com.mode.create; public class FactoryTest { public static void main(String[] args){ Provider provider = new MyFactoryOne(); MyInterface myi = provider.produce(); myi.print(); } }
運行結果依舊顯然。
再回顧:抽象工廠模式就是創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。
參考:Java經典設計模式之五大創建型模式(附實例和詳解)
Java設計模式之工廠模式