JAVA抽象工廠設計模式:Abstract Factory
阿新 • • 發佈:2019-01-25
wangking717 寫道
抽象工廠模式:
提供一個建立一系列相關活相互依賴物件的介面,而無需指定他們具體的類。
提供一個建立一系列相關活相互依賴物件的介面,而無需指定他們具體的類。
舉2個例子:
1.BOSS要求提供JDBC,Hibernate,Ibatis等多套資料庫操作解決方案,能夠無成本地在這三個解決方案間切換。
2.系統的產品有多於一個的產品族,而系統只消費其中某一族的產品(Unix&Windows)
Button--->UnixButton/WinButton
Text----->UnixText/WinText
Unix產品族和Windows產品族,不會同時使用。
Factory--->UnixFactory/WinFactory
看類圖吧:
BOOK產品:
public interface IBookDAO { public void drop(); public void save(); public void copy(); } public class MySQLBookDAO implements IBookDAO { public void copy() { System.out.println("copy book using the MySQL..."); } public void drop() { System.out.println("drop book using the MySQL..."); } public void save() { System.out.println("save book using the MySQL..."); } } public class SQLServerBookDAO implements IBookDAO { public void copy() { System.out.println("copy book using the sqlserver..."); } public void drop() { System.out.println("drop book using the sqlserver..."); } public void save() { System.out.println("save book using the sqlserver..."); } }
USER產品:
public interface IUserDAO { public void save(); public void delete(); public void get(); } public class MySQLUserDAO implements IUserDAO { public void delete() { System.out.println("delete user using the MySQL..."); } public void get() { System.out.println("get user using the MySQL..."); } public void save() { System.out.println("save user using the MySQL..."); } } public class SQLServerUserDAO implements IUserDAO { public void delete() { System.out.println("delete user using the sqlserver..."); } public void get() { System.out.println("get user using the sqlserver..."); } public void save() { System.out.println("save user using the sqlserver..."); } }
FACTORY:
public interface IFactory {
public IUserDAO getUserDAO();
public IBookDAO getBookDAO();
}
public class MySQLFactory implements IFactory {
public IBookDAO getBookDAO() {
return new MySQLBookDAO();
}
public IUserDAO getUserDAO() {
return new MySQLUserDAO();
}
}
public class SQLServerFactory implements IFactory {
public IBookDAO getBookDAO() {
return new SQLServerBookDAO();
}
public IUserDAO getUserDAO() {
return new SQLServerUserDAO();
}
}
TEST:
public class Test {
public static void main(String[] args) {
IFactory factory = new SQLServerFactory();
factory.getUserDAO().delete();
factory.getBookDAO().copy();
}
}
但是這裡也有一個不好的地方,如果我在系統的各個地方都IFactory factory = new ...的話,假設new了100處,以後要換為MYSQLFactory的話,就得改100處地方。。所以可以抽象工廠+簡單工廠來解耦。
抽象工廠的簡單工廠類:
public class AbstractFactory {
private static final String DB = "mysql";
public static IFactory getDataAcessFactory(){
IFactory factory = null;
if("mysql".equals(DB)){
factory = new MySQLFactory();
}else if("sqlserver".equals(DB)){
factory = new SQLServerFactory();
}else{
throw new RuntimeException("No DB logic matched in the abstract factory.");
}
return factory;
}
}
客戶端測試:
public class Test2 {
public static void main(String[] args) {
IFactory factory = AbstractFactory.getDataAcessFactory();
factory.getUserDAO().delete();
factory.getBookDAO().copy();
}
}