設計模式學習--Abstarct Factory

What

Abstarct Factory:提供一個建立一系列相關或相互依賴的接口,而無需指定他們具體類。java

Why

Abstarct Factory是建立型設計模式的一種,主要在建立對象時解耦,避免對象的直接依賴,方便替換與定製。常見的好比:一個功能有兩種不一樣的風格,須要根據配置來切換不一樣的風格時,或者在一個須要適用於多個數據庫切換的程序中,都會使用Abstact Factory。
適用於Abstarct Factory的場景:
一、系統的展示或者功能須要可配置時。
二、系統模塊的建立,須要獨立於系統模塊時。
三、系統須要動態定製時。mysql

How

假設以下場景,在編寫數據庫訪問層時,須要支持兩種數據庫的切換,好比能夠支持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("");
    }
}

以上實例的類圖以下:

設計模式

Discuss

在以上的例子中,還能夠延伸到把數據庫的選擇寫在配置文件中,而後在系統啓動時根據配置經過反射加載不一樣的程序,這個在之前使用c#作一個系統時用到過,在java的web開發中,通常使用spring框架,它提供了IOC技術,經過配置bean來作數據源的初始化。
在spring的源代碼中,也有Abstract Factory的使用,好比BeanFactory就是一個例子,固然它的設計要比本文中的例子,複雜的多。

ChangeLog

在學習時發現本節示例不夠完善,因此進行了完善,增長在ChangeLog中,二者的區別和聯繫在設計模式學習--Factory Method的Discuss章節中。
示例代碼基於以上示例修改,若是理解了示例中的代碼,修改成以下結構的代碼比較簡單就不在帖出,也能夠到去個人GitHub下載。

相關文章
相關標籤/搜索