之前學習了簡單工廠我們明白了,簡單工廠雖然有一定的好處,但是還不夠好,它無法滿足開閉原則,我們在如果新增產品的話,就需要更改已有的工廠類。工廠方法模式就是在簡單工廠的基礎上,滿足開閉原則,讓我們只需要新增類就好,不用去更改已有**。
展示下之前的database、mysql、sqlserver三個類。
package study.factory.method;
/** * @author 阿呆的小雞仔
*/public
abstract
class
database
/** * 設定資料庫名稱
* @return 資料庫的名稱
*/protected
abstract string getdatabasename()
;/**
* 建立資料庫連線例項需要的操作,每種資料庫應該都是不一樣的
*/void
prepare()
/** * 建立連線完成時的操作
*/void
finish()
/** * 假設這個是例項的功能,可以用來執行查詢語句
* @param query 查詢語句
*/public
abstract
void
query
(string query)
;}
package study.factory.method;
/** * @author 阿呆的小雞仔
*/public
class
mysql
extends
database
@override
public string getdatabasename()
@override
public
void
query
(string query)
}
package study.factory.method;
/** * @author 阿呆的小雞仔
*/public
class
sqlserver
extends
database
@override
public string getdatabasename()
@override
void
prepare()
@override
public
void
query
(string query)
}
那新的工廠類又是怎麼寫的呢,怎麼做才可以滿足開閉原則?簡單工廠是將所有的產品都讓乙個工廠生產,所以要新增產品種類就一定會需要修改現有工廠類,那我們如果讓乙個工廠只生產乙個產品,那麼是不是就可以滿足開閉原則 了。
第一步:編寫所有工廠的抽象類
package study.factory.method;
/** * @author 阿呆的小雞仔
*/public
abstract
class
databasefactory
第二步:編寫具體的工廠類去實現抽象工廠類package study.factory.method;
/** * @author 阿呆的小雞仔
*/public
class
mysqldatabasefactory
extends
databasefactory
}
package study.factory.method;
/** * @author 阿呆的小雞仔
*/public
class
sqlserverdatabasefactory
extends
databasefactory
}
第三步:編寫測試類使用一下package study.factory;
import study.factory.method.database;
import study.factory.method.databasefactory;
import study.factory.method.mysqldatabasefactory;
public
class
main
}
總結:
現在,如果我們還需要新增加乙個oracle資料庫,只需要編寫乙個oracledatabasefactory類,並且讓他繼承databasefactory抽象類就可以了,不用修改之前寫過的類。
工廠方法模式 工廠方法模式 二
工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...
設計模式(二)工廠方法模式 抽象工廠模式
工廠方法模式與簡單工廠模式的區別在於 簡單工廠模式用單一工廠來生產所有同種類的產品,而工廠模式是用對應的工廠來生產同一種類的不同產品。對於工廠方法模式而言,其簡單模型的uml為 工廠方法模式的定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到工廠抽象類的子類。...
工廠模式二 工廠方法模式
使用者只需要關心產品對應的工廠,不需要關心建立細節。例如貓和狗都屬於動物一類,都具有吃飯這個功能。先定義介面ianimal public inte ce ianimal實現介面ianimal介面cat類和dog類 public class cat implements ianimal public ...