設計模式 工廠方法模式及其應用

2021-09-13 15:57:06 字數 2026 閱讀 5792

工廠方法模式:是23中基本設計模式之一,它定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類的例項化延遲到了子類。

注: 這裡所謂的 「決定」 並不是指模式允許子類本身在執行時做決定,而是在編寫建立者類時,不需要知道實際建立的產品是哪乙個,選擇了使用哪個子類,就等於決定了建立的產品是什麼了。

工廠方法模式的四要素:

來看一下它的類圖:

下面我們通過例項來強化學習一下:

我們以去專賣店買筆記本做了例子,這裡的產品肯定就是筆記本了,因為筆記本的種類很多,所以我們定義乙個筆記本的抽象基類,這樣可以統一產品的引用類,與具體的實現類隔離開來。

但是實際生活中,有很多不同的專賣店,每家專賣店買的電腦品牌也大有不同,這裡我們就可以運用到工廠方法模式。有了不同專賣店的概念,每家專賣店都有自己的品牌及其系列電腦。這裡我們將專賣店作為超類,讓不同品牌的專賣店都繼承它,但是由每個品牌的專賣店決定提供什麼型號的電腦。

此時我們就利用了工廠模式設計實現了我們的需求。具體**如下:

抽象專賣店類:

package com.dz.demo.pattern.factorypattern.factory;

import com.dz.demo.pattern.factorypattern.product.laptop;

/** * created by dzwang on 2019/3/25.

*/public abstract class laptopstore

abstract laptop chooselaptop(string type);

}

繼承於它的兩個實現類:

// a專賣店

public class alaptopfactory extends laptopstore else if (type.equals("a2"))

return laptop;

}}// b專賣店

public class blaptopfactory extends laptopstore else if (type.equals("b2"))

return laptop;}}

定義抽象的產品基類:

public abstract class laptop
具體的產品類:

// a專賣店 a1型號筆記本

public class a1laptop extends laptop

}// a專賣店 a2型號筆記本

public class a2laptop extends laptop

}// b專賣店 b1型號筆記本

public class b1laptop extends laptop

}// b專賣店 b2型號筆記本

public class b2laptop extends laptop

}

具體測試如下:

public class factorydemo 

}// 執行結果如下:

// i want to buy a1

// name:a1

// price:¥5000

// i want to buy b2

// name:b2

// price:¥9000

工廠方法模式中具體類的實現和簡單工廠模式其實很類似,不同的是工廠方法模式中的具體類擴充套件自乙個類。

我們從中可以學習到:

將建立物件的**進行封裝,集中在乙個類中或者方法中,可以有效的管理**,方便後期維護和擴充套件。

在這裡我們是針對介面的程式設計,而不是針對實現程式設計,其實也就是設計模式六大原則中的(依賴倒置原則)。

設計模式 工廠方法模式及應用

在 簡單工廠模式 一節介紹了簡單工廠模式,提到了簡單工廠模式違背了開閉原則,而 工廠方法模式 是對簡單工廠模式的進一步抽象化,其好處是可以使系統在不修改原來 的情況下引進新的產品,即滿足開閉原則。模式的結構與實現 工廠方法模式由抽象工廠 具體工廠 抽象產品和具體產品等4個要素構成。本節來分析其基本結...

設計模式 工廠方法模式

一 工廠方法 factory method 模式 工廠方法模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到工廠子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角...

設計模式 工廠方法模式

1 factorymethod.h ifndef factorymethod h define factorymethod h include include using namespace std class osproduct 產品,product,產品的抽象類 class windowspro...