Java设计模式 之 工厂方法模式
1. 使用設計模式的好處:可提高代碼的重復性,讓代碼更容易被他人理解,保證代碼的可靠性。
2. 工廠模式定義:就是創建一個工廠類來創建你需要的類,工廠模式包括工廠模式和抽象工廠模式,抽象工廠模式是工廠模式的擴展。
3. 工廠模式意圖:定義一個接口來創建對象,但是讓子類來決定哪些類需要被實例化,工廠方法把實例化工作推遲到子類中去實現。
4. 工廠方法適合場景:
?<1>. 有一組類似的對象需要創建
?<2>. 在編碼時不能預見需要創建哪種類的實例
?<3>. 系統需要考慮擴展性,不應依賴產品類實例如何被創建、組合和表達的細節
5. 工廠方法類圖:
代碼實現,舉個例子,以一汽大眾汽車工廠為例,大家都知道,一汽大眾可生產多款汽車,有速騰、高爾夫、CC、寶來等等,我們就是使用工廠來創建不同款式的汽車。
<1>. 創建汽車接口,該接口就有一個生產汽車抽象。
package com.dasauto.car;/*** 一汽大眾汽車接口* @author DuanCZ*/public interface ICar {/*** 生產汽車*/public void createCar();}?
<2>. 創建速騰汽車實現類,該類實現汽車接口
package com.dasauto.car;public class SagitarCar implements ICar {/*** 生產速騰汽車*/public void createCar() {System.out.println("-----------生產一臺速騰汽車---------");}}<3>,創建高爾夫汽車實現類,該類實現汽車接口
package com.dasauto.car;public class GolfCar implements ICar {/*** 生產高爾夫汽車*/public void createCar() {System.out.println("----------創建一臺高爾夫汽車----------");}}<4>, 創建汽車工廠類,該類將根據不同款式的汽車類名稱來實例化對象
package com.dasauto.car;public class CarFactory {/*** 根據類名稱去創建汽車對象* @param className* @return*/public ICar getCar(String className){try {ICar car = (ICar) Class.forName(className).newInstance();return car;} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}?
<5>, 模擬客戶端,測試
package com.dasauto.car;public class CarClient {public static void main(String[] args) {CarFactory carFactory = new CarFactory();ICar car = carFactory.getCar("com.dasauto.car.SagitarCar");car.createCar();}}
?工廠方法模式很簡單,就是單一的一種產品,這不同汽車類名稱可以配置到xml中去,如果以后多了一種汽車,那么就是編寫好實現類后,配置個XML文件,這樣客戶端就可以很簡單的應用了。
?
6. 抽象工廠方法類圖
相比工廠方法模式,抽象工廠就復雜一些了,它有產品族的概念,也就是說不是生產單一產品了,而是生產一系列產品。
代碼實現,例如我們做一款程序,程序可能使用多種不同的數據庫來完成數據持久化操作。下面是根據模型模擬代碼
<1>,
package com.dcz.demo;/*** 抽象產品A* @author DuanCZ*/public interface IProductA {public void method_1();public void method_2();}?
<2>,
package com.dcz.demo;/*** 抽象產品B* @author DuanCZ*/ public interface IProductB {public void method_1();public void method_2();}?
<3>,
package com.dcz.demo;public interface IAbstractFactory {public IProductA productA();public IProductB productB();}?
<4>,
package com.dcz.demo;public class concretenessProductA1 implements IProductA {@Overridepublic void method_1() {System.out.println("生產等級為1的A類Method_1");}@Overridepublic void method_2() {System.out.println("生產等級為1的A類Method_2");}}?
<5>,
package com.dcz.demo;public class concretenessProductA2 implements IProductA {@Overridepublic void method_1() {System.out.println("生產等級為2的A類Method_1");}@Overridepublic void method_2() {System.out.println("生產等級為2的A類Method_2");}}?
<6>,
package com.dcz.demo;public class concretenessProductB1 implements IProductB {@Overridepublic void method_1() {System.out.println("生產等級為1的B類Method_1");}@Overridepublic void method_2() {System.out.println("生產等級為1的B類Method_2");}}?
<7>,
package com.dcz.demo;public class concretenessProductB2 implements IProductB {@Overridepublic void method_1() {System.out.println("生產等級為2的B類Method_1");}@Overridepublic void method_2() {System.out.println("生產等級為2的B類Method_2");}}?
<8>, package com.dcz.demo;public class ConcreateFactory1 implements IAbstractFactory {public IProductA productA() {return new concretenessProductA1();}public IProductB productB() {return new concretenessProductB1();}}<9>, package com.dcz.demo;public class ConcreateFactory2 implements IAbstractFactory {@Overridepublic IProductA productA() {return new concretenessProductA2();}@Overridepublic IProductB productB() {return new concretenessProductB2();}}
<10>, package com.dcz.demo;public class Client {public static void main(String[] args) {IAbstractFactory concreateFactory1 = new ConcreateFactory1();IProductA productA = concreateFactory1.productA();productA.method_1();productA.method_2();} }
設計原則: 要依賴抽象,不要依賴具體類
?
轉載于:https://www.cnblogs.com/dcz1001/p/5927660.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Java设计模式 之 工厂方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么在泰山上进行滑翔伞活动?
- 下一篇: List的遍历 Java