1. 程式人生 > >JAVA抽象工廠設計模式:Abstract Factory

JAVA抽象工廠設計模式:Abstract Factory

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();
		
	}
	
}