Abstarct Factory:提供一個建立一系列相關或相互依賴的接口,而無需指定他們具體類。java
Abstarct Factory是建立型設計模式的一種,主要在建立對象時解耦,避免對象的直接依賴,方便替換與定製。常見的好比:一個功能有兩種不一樣的風格,須要根據配置來切換不一樣的風格時,或者在一個須要適用於多個數據庫切換的程序中,都會使用Abstact Factory。
適用於Abstarct Factory的場景:
一、系統的展示或者功能須要可配置時。
二、系統模塊的建立,須要獨立於系統模塊時。
三、系統須要動態定製時。mysql
假設以下場景,在編寫數據庫訪問層時,須要支持兩種數據庫的切換,好比能夠支持sqlserver和mysql的切換。以這個簡單的例子,說明Abstarct Factory的實現
首先咱們定義咱們的dao接口:git
public interface UserDao { void insert(User user); void delete(String id); User find(String id); }
這個接口須要三個簡單的方法,插入,刪除,查詢
定義用於建立Dao實例的工廠接口github
public interface DaoFactory { UserDao create(); }
用於訪問sqlserver的UserDao的實現web
public class SqlServerUserDaoImpl implements UserDao { @Override public void insert(User user) { System.out.println("sqlserver insert user"); } @Override public void delete(String id) { System.out.println("sqlserver delete user"); } @Override public User find(String id) { System.out.println("sqlserver find user"); return null; } }
用於訪問mysql的UserDao的實現spring
public class MysqlUserDaoImpl implements UserDao { @Override public void insert(User user) { System.out.println("mysql insert user"); } @Override public void delete(String id) { System.out.println("mysql delete user"); } @Override public User find(String id) { System.out.println("mysql find user"); return null; } }
用於建立sqlserver userDao的工廠sql
public class SqlserverDaoFactoryImpl implements DaoFactory { @Override public UserDao create() { return new SqlServerUserDaoImpl(); } }
用於建立mysql userDao的工廠數據庫
public class MysqlDaoFactoryImpl implements DaoFactory { @Override public UserDao create() { return new MysqlUserDaoImpl(); } }
客戶端調用方法c#
public class App { public static void main( String[] args ){ DaoFactory daoFactory=new MysqlDaoFactoryImpl(); UserDao userDao=daoFactory.create(); userDao.insert(null); DaoFactory daoFactory1=new SqlserverDaoFactoryImpl(); UserDao userDao1=daoFactory1.create(); userDao1.delete(""); } }
以上實例的類圖以下:
設計模式
在以上的例子中,還能夠延伸到把數據庫的選擇寫在配置文件中,而後在系統啓動時根據配置經過反射加載不一樣的程序,這個在之前使用c#作一個系統時用到過,在java的web開發中,通常使用spring框架,它提供了IOC技術,經過配置bean來作數據源的初始化。
在spring的源代碼中,也有Abstract Factory的使用,好比BeanFactory就是一個例子,固然它的設計要比本文中的例子,複雜的多。
在學習時發現本節示例不夠完善,因此進行了完善,增長在ChangeLog中,二者的區別和聯繫在設計模式學習--Factory Method的Discuss章節中。
示例代碼基於以上示例修改,若是理解了示例中的代碼,修改成以下結構的代碼比較簡單就不在帖出,也能夠到去個人GitHub下載。