玩轉設計模式:二、創建型-抽象工廠(Abstract Factory)模式

工廠方法模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須對工廠類進行修改,這違背了開閉原則,所以,從設計角度考慮,有一定的問題,如何解決?就用到抽象工廠模式,創建多個工廠類,這樣一旦需要增加新功能,直接加新的工廠類就可以了,不需要修改之前的代碼。

案例

依然是調用數據庫的查詢方法的例子,數據庫有Oracle和MySQL兩種。只不過這次不是用一個工廠的方法看來生產產品,而是每個產品用一個新工廠來生產。

1、UML

玩轉設計模式:二、創建型-抽象工廠(Abstract Factory)模式

2、創建DB接口

<code>public interface DB {
public String select();
}/<code>

3、創建實現DB接口的Oracle和MySQL類

<code>public class Oracle implements DB{
@Override
public String select() {
return "Oracle數據庫查詢";
}
}/<code>
<code>public class MySQL implements DB{
@Override
public String select() {
return "MySQL數據庫查詢";
}
}/<code>

3、創建工廠的統一接口(Provide)

因為這一批產品都是類似的作用,都是用於數據庫操作的產品,所以這一批工廠也該約束為類似的左右,只生產數據庫有關的產品。

<code>/**
* 工廠接口
* 有新產品的話,直接新建一個工廠實現這個類即可
* @author suibibk.com
*
*/
public interface Provide {
public DB product();
}/<code>

4、Oracle數據庫生產工廠(OracleFactory)

<code>/**
* 專門提供Oracle產品的工廠
* @author suibibk.com
*/
public class OracleFactory implements Provide{
@Override
public DB product() {
return new Oracle();
}
}/<code>

實現統一的接口Provide.

5、MySQL數據庫生產工廠(MySQLFactory)

<code>/**
* 專門提供MySQL產品的工廠
* @author suibibk.com
*/
public class MySQLFactory implements Provide{
@Override
public DB product() {
return new MySQL();
}
}/<code>

實現統一的接口Provide.

6、測試類,啟動測試(App)

<code>/**
* 測試類
* @author suibibk.com
*
*/
public class App {
public static void main(String[] args) {
Provide provide1 = new OracleFactory();
Provide provide2 = new MySQLFactory();
DB db1 = provide1.product();
DB db2 = provide2.product();
System.out.println(db1.select());

System.out.println(db2.select());
}
}/<code>

運行輸出如下結果

<code>Oracle數據庫查詢
MySQL數據庫查詢/<code>

總結

這個模式的好處就是,如果你現在想增加一個功能:Server-sql,則只需要做一個實現類,實現DB接口,同時做一個工廠類,實現Provider接口,就OK啦,無需要去改動現成的代碼。這樣做,拓展性較好。


分享到:


相關文章: