抽象工廠模式

抽象工廠模式(Abstract Factory Pattern)

定義:

    Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
java

    爲建立一組相關或相互依賴的對象提供一個接口,而無需指定他們的具體類。設計模式

描述:

    工廠模式的不足:類的建立依賴工廠類,也就是說,若是想要拓展程序,必須對工廠類進行修改,這違背了閉包原則。閉包

    抽象工廠是工廠模式的升級版本,在有多個業務品種、業務分類時,經過抽象工廠模式產生須要的對象。ide

    經過建立多個工廠類,這樣一旦須要增長新的功能,直接增長新的工廠類就能夠了,不須要修改以前的代碼。spa

通用類圖:

    

通用代碼:

    工廠類的抽象類
操作系統

package AbstractFactory;

public abstract class AbstractCreator {
	
	//建立A產品方法
	public abstract AbstractProductA createProductA();
	
	//建立B產品方法
	public abstract AbstractProductB createProductB();
}

    產品A的抽象類
設計

package AbstractFactory;

public abstract class AbstractProductA {
	
	//產品A共有的方法
	public void shareMethod(){
		System.out.println("產品A共有的業務邏輯處理方法...");
	}
	
	//產品A不一樣子產品不一樣實現
	public abstract void doSomething();
	
}

    產品B 的抽象類
code

package AbstractFactory;

public abstract class AbstractProductB {
	
	//產品B共有的方法
	public void shareMethod(){
		System.out.println("產品B共有的業務邏輯處理方法...");
	}
	
	//產品B不一樣子產品不一樣實現
	public abstract void doSomething();
	
}

    產品線1的工廠實現類
對象

package AbstractFactory;

public class Creator1 extends AbstractCreator {

	@Override
	public AbstractProductA createProductA() {
		return new ProductA1();
	}

	@Override
	public AbstractProductB createProductB() {
		return new ProductB1();
	}

}

    產品線2的工廠實現類接口

package AbstractFactory;

public class Creator2 extends AbstractCreator {

	@Override
	public AbstractProductA createProductA() {
		return new ProductA2();
	}

	@Override
	public AbstractProductB createProductB() {
		return new ProductB2();
	}

}

    產品A1

package AbstractFactory;

public class ProductA1 extends AbstractProductA {

	@Override
	public void doSomething() {
		System.out.println("產品A1的業務邏輯處理方法...");
	}

}

    產品A2

package AbstractFactory;

public class ProductA2 extends AbstractProductA {

	@Override
	public void doSomething() {
		System.out.println("產品A2的業務邏輯處理方法...");
	}

}

    產品B1

package AbstractFactory;

public class ProductB1 extends AbstractProductB{

	@Override
	public void doSomething() {
		System.out.println("B1的業務邏輯處理方法...");
	}

}

    產品B2

package AbstractFactory;

public class ProductB2 extends AbstractProductB{

	@Override
	public void doSomething() {
		System.out.println("B2的業務邏輯處理方法...");
	}

}

優勢:

    1.良好的封裝性

    2.產品族內的約束爲非公開狀態

缺點:

    產品族擴展很是困難,可能要修改抽象類或接口,違背開閉原則。

使用場景:

    一個對象族(或者是一組沒有任何關係的對象)都有相同的約束,則能夠使用抽象工廠模式

    例如:一個應用須要在三個不一樣平臺上運行,則能夠經過抽象工廠模式屏蔽掉操做系統對應用的影響,由不一樣的產品類去處理與操做系統交互的信息。


參考資料:

《設計模式之禪》          秦小波著

《JAVA設計模式》        蒐集整理來自互聯網

相關文章
相關標籤/搜索