英文: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é)合反射的方式來解決。