舉例說明:
/**
* 作者:wanglei
* 郵箱:229846388@qq.com
* 抽象工廠模式
* 工廠類
*/
abstract class Factory {
/**
* @return 制造容器
*/
public abstract Product ManufactureContainer();
/**
* @return 制造模具
*/
public abstract Product ManufactureMould();
}
/**
* A廠 - 生產模具+容器產品
*/
class FactoryA extends Factory{
@Override
public Product ManufactureContainer() {
return new ContainerProductA();
}
@Override
public Product ManufactureMould() {
return new MouldProductA();
}
}
/**
*B廠 - 生產模具+容器產品
*/
class FactoryB extends Factory{
@Override
public Product ManufactureContainer() {
return new ContainerProductB();
}
@Override
public Product ManufactureMould() {
return new MouldProductB();
}
}
/**
* 作者:wanglei
* 郵箱:229846388@qq.com
* 抽象工廠模式
* 抽象產品族類
*/
abstract class Product {
public abstract void show();
}
/**
* 容器產品抽象類
*/
abstract class ContainerProduct extends Product {
@Override
public void show() {
}
}
/**
* 模具產品抽象類
*/
abstract class MouldProduct extends Product{
@Override
public void show() {
}
}
/**
* 容器產品A類
*/
class ContainerProductA extends ContainerProduct{
@Override
public void show() {
System.out.println("生產出了容器產品A");
}
}
/**
* 容器產品B類
*/
class ContainerProductB extends ContainerProduct{
@Override
public void show() {
System.out.println("生產出了容器產品B");
}
}
/**
* 模具產品A類
*/
class MouldProductA extends MouldProduct{
@Override
public void show() {
System.out.println("生產出了模具產品A");
}
}
/**
* 模具產品B類
*/
class MouldProductB extends MouldProduct{
@Override
public void show() {
System.out.println("生產出了模具產品B");
}
}
/**
* 作者:wanglei
* 郵箱:229846388@qq.com
* 抽象工廠模式
* 定義:
* 1.抽象工廠模式,即Abstract Factory Pattern,提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類;具體的工廠負責實現具體的產品實例。
* 2.抽象工廠模式與工廠方法模式最大的區別:抽象工廠中每個工廠可以創建多種類的產品;而工廠方法每個工廠只能創建一類
* 主要作用:
* 1.允許使用抽象的接口來創建一組相關產品,而不需要知道或關心實際生產出的具體產品是什么,這樣就可以從具體產品中被解耦。
* 解決的問題:
* 每個工廠只能創建一類產品,即工廠方法模式的缺點
* 實例概況:
* 背景:小成有兩間塑料加工廠(A廠僅生產容器類產品;B廠僅生產模具類產品);隨著客戶需求的變化,A廠所在地的客戶需要也模具類產品,B廠所在地的客戶也需要容器類產品;
* 沖突:沒有資源(資金+租位)在當地分別開設多一家注塑分廠
* 解決方案:在原有的兩家塑料廠里增設生產需求的功能,即A廠能生產容器+模具產品;B廠間能生產模具+容器產品。
*/
public class SimpleFactoryPattern {
public static void main(String[] args) {
FactoryA factoryA = new FactoryA();
FactoryB factoryB = new FactoryB();
//A廠當地客戶需要容器產品A
factoryA.ManufactureContainer().show();
//A廠當地客戶需要模具產品A
factoryA.ManufactureMould().show();
//B廠當地客戶需要容器產品B
factoryB.ManufactureContainer().show();
//B廠當地客戶需要模具產品B
factoryB.ManufactureMould().show();
}
}
/**
* 結果:
* 生產出了容器產品A
* 生產出了模具產品A
* 生產出了容器產品B
* 生產出了模具產品B
* 優點:
* 1.降低耦合:
* 抽象工廠模式將具體產品的創建延遲到具體工廠的子類中,這樣將對象的創建封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利于后期的維護和擴展;
* 2.更符合開-閉原則:
* 新增一種產品類時,只需要增加相應的具體產品類和相應的工廠子類即可::簡單工廠模式需要修改工廠類的判斷邏輯
* 3.符合單一職責原則:
* 每個具體工廠類只負責創建對應的產品::簡單工廠中的工廠類存在復雜的switch邏輯判斷
* 4.不使用靜態工廠方法,可以形成基于繼承的等級結構。::簡單工廠模式的工廠類使用靜態工廠方法
* 缺點:
* 1.抽象工廠模式很難支持新種類產品的變化。這是因為抽象工廠接口中已經確定了可以被創建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。
* 2.對于新的產品族符合開-閉原則;對于新的產品種類不符合開-閉原則,這一特性稱為開-閉原則的傾斜性。
* 應用場景:
* 1.一個系統不要求依賴產品類實例如何被創建、組合和表達的表達,這點也是所有工廠模式應用的前提。
* 2.這個系統有多個系列產品,而系統中只消費其中某一系列產品
* 3.系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。
*/
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。