設(shè)計模式之抽象工廠

英文:Abstract Factory

提供一個創(chuàng)建一系列相關(guān)相互依賴對象的接口,而無需指定他們具體的類。抽象工廠為不同產(chǎn)品族的對象創(chuàng)建提供接口。

使用場景:系統(tǒng)需要在不同產(chǎn)品族進(jìn)行切換?

public interface IFacfory {

? ? public IUser createUser();

? ? public IDepartment createDepartment();

}

public interface IUser {

? ? public void insert();

? ? public void getById();

}

public interface IDepartment {

? ? public void insert();

? ? public void getDepartmentById();

}

public class SqlServerUser implements IUser {

? ? @Override

? ? public void insert() {

? ? ? ? System.out.println("insert into sqlserver.");

? ? }

? ? @Override

? ? public void getById() {

? ? ? ? System.out.println("get user by id from sqlserver.");

? ? }

}

public class SqlServerDepartment implements IDepartment {

? ? @Override

? ? public void insert() {

? ? ? ? System.out.println("insert department into sqlserver.");

? ? }

? ? @Override

? ? public void getDepartmentById() {

? ? ? ? System.out.println("get department in sqlserver by id.");

? ? }

}

public class AccessUser implements IUser {

? ? @Override

? ? public void insert() {

? ? ? ? System.out.println("insert into access");

? ? }

? ? @Override

? ? public void getById() {

? ? ? ? System.out.println("get by id from access");

? ? }

}

public class AccessDepartment implements IDepartment {

? ? @Override

? ? public void insert() {

? ? ? ? System.out.println("insert department into sqlserver.");

? ? }

? ? @Override

? ? public void getDepartmentById() {

? ? ? ? System.out.println("get department in sqlserver by id.");

? ? }

}

//不同產(chǎn)品組使用一個工廠

public class SqlServerFactory implements IFacfory {

? ? @Override

? ? public IUser createUser() {

? ? ? ? return new SqlServerUser();

? ? }

? ? @Override

? ? public IDepartment createDepartment() {

? ? ? ? return new SqlServerDepartment();

? ? }

}

public class AccessFactory implements IFacfory {

? ? @Override

? ? public IUser createUser() {

? ? ? ? return new AccessUser();

? ? }

? ? @Override

? ? public IDepartment createDepartment() {

? ? ? ? return new AccessDepartment();

? ? }

}

客戶端:

IFacfory facfory = new AccessFactory();

IUser user = facfory.createUser();

IDepartment department = facfory.createDepartment();

user.insert();

user.getById();

department.insert();

department.getDepartmentById();


抽象工廠最大的好處就是便于交換產(chǎn)品系列,具體工廠在代碼中一般只出現(xiàn)一次。這就使得改變應(yīng)用的具體工廠很容易。

第二個好處是他能讓具體的創(chuàng)建對象實例和客戶端分離,客戶端是通過他們的抽象接口操作實例

抽象工廠不太易于拓展,如果需要自增功能,或者自增產(chǎn)品,則需要至少修改三個類,而且實例化的代碼是寫死在程序中的 , 這樣無法避免違背開放-關(guān)閉原則。

對于上述問題,可以通過配置文件,結(jié)合反射的方式來解決。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容