Java设计模式——工厂模式
前言
? 工廠模式是一種比較常見的創(chuàng)建模式。有時(shí),可能你使用了工廠模式而你卻還不知道你已經(jīng)使用了它。至少我感覺下面說的第一種簡單工廠模式,你是已經(jīng)很熟悉了。并且是經(jīng)常使用的。不信,就繼續(xù)向下看。
?
版權(quán)說明
著作權(quán)歸作者所有。
商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
本文作者:Q-WHai
發(fā)表日期: 2016年4月14日
本文鏈接:https://qwhai.blog.csdn.net/article/details/46225213
來源:CSDN
更多內(nèi)容:分類 >> 設(shè)計(jì)模式
?
簡單工廠模式(Simple Factory Pattern)
? 從簡單的工廠模式開始說起的話,我們要知道工廠模式的目的是什么?工廠模式的目的在于程序的可擴(kuò)展性。而對(duì)于簡單工廠模式來說,它是為了讓程序有一個(gè)更好地封裝,降低程序模塊之間的耦合程度。
? 對(duì)于簡單的工廠模式,其實(shí)也可以將其理解成為一個(gè)創(chuàng)建對(duì)象的工具類。工具類的形式,可以仿造如下代碼編寫:
?
public class SimpleFactory {public Object create(Class<?> clazz) {if (clazz.getName().equals(Plane.class.getName())) {return createPlane();} else if (clazz.getName().equals(Broom.class.getName())) {return createBroom();}return null;}private Broom createBroom() {return new Broom();}private Plane createPlane() {return new Plane();} }測試代碼如下:
?
public class FactoryTest {public static void main(String[] args) {// 簡單工廠模式測試SimpleFactory simpleFactory = new SimpleFactory();Broom broom = (Broom) simpleFactory.create(Broom.class);broom.run();} }正如之前所說的,簡單的工廠模式,就是去創(chuàng)建一個(gè)創(chuàng)建對(duì)象的工具類。在這個(gè)工具類里面,我們就可以進(jìn)行一些其他操作,比如對(duì)象的初始化。這樣就避免了把對(duì)象初始化的大量代碼(如果有大量代碼的話)放在構(gòu)造函數(shù)里了。
?
?
?
工廠方法模式(Factory Method Pattern)
之前說了簡單的工廠模式,在簡單的工廠模式里,我們創(chuàng)建了一個(gè)類似工具的類來創(chuàng)建相應(yīng)的具體類對(duì)象。正因?yàn)槠涮^簡單,有一點(diǎn)不成規(guī)范。所以,這里要對(duì)其做一些適當(dāng)?shù)胤庋b。
我們來看一下工廠方法模式的定義吧。工廠方法模式定義了一個(gè)創(chuàng)建對(duì)象的接口,但由子類決定要實(shí)例化哪一個(gè)。工廠方法讓類把實(shí)例化推遲到了子類。(定義摘自《Head First設(shè)計(jì)模式》)
圖-1 工廠方法模式
抽象工廠:
我們的抽象工廠可以是類似這樣的:
?
public abstract class VehicleFactory {public abstract Moveable create(); }具體工廠:
代碼就是這樣簡單而美好。而它有一個(gè)具體的實(shí)現(xiàn)工廠類:
?
public class BroomFactory extends VehicleFactory {@Overridepublic Moveable create() {return new Broom();}}這個(gè)具體的實(shí)現(xiàn)工廠告訴我們,這里可以通過 create() 方法來創(chuàng)建一個(gè) Broom 對(duì)象。
我們可以這樣來理解他們的關(guān)系:有一個(gè)大的工廠它就是 VehicleFactory,VehicleFactory工廠里又有很多生產(chǎn)車間,其中有一個(gè)就是 BroomFactory。我們的具體產(chǎn)品都是通過這些生產(chǎn)車間來負(fù)責(zé)生產(chǎn)的。
抽象產(chǎn)品接口:
說到了產(chǎn)品,我們可以先試想一下這些具體的產(chǎn)品都會(huì)有什么樣的性質(zhì)。我們可以這樣來定義它們:
public interface Moveable {public void run(); }具體產(chǎn)品:
嗯,這是一些可以run(移動(dòng))的產(chǎn)品。就 BroomFactory 生產(chǎn)車間而言,它負(fù)責(zé)生產(chǎn) Broom。這個(gè) Broom 是具有 Moveable 的屬性。那么它的實(shí)現(xiàn)可以這樣來寫:
public class Broom implements Moveable {@Overridepublic void run() {System.out.println("我是Broom.我在飛...");}}功能測試:
我們有工廠,并且知道了工廠要生產(chǎn)的產(chǎn)品了。那么我們就來生產(chǎn)一個(gè) Broom 來試試吧:
?
VehicleFactory factory = new BroomFactory(); Moveable moveable = factory.create(); moveable.run();這樣我就生產(chǎn)了一個(gè) Broom 了。是不是 so easy?
?
?
抽象工廠模式(Abstract Factory Pattern)
?
?
從上面的工廠方法中的結(jié)構(gòu)圖中,我們可以看到其中的具體工廠A和B是兩個(gè)完全獨(dú)立的。兩者除了都是抽象工廠的子類,沒有任何其他的交集。
但是,如果我們有這樣一個(gè)需求:具體工廠A和B需要生產(chǎn)一些同類型的不同產(chǎn)品。那么我們就可以試試抽象工廠模式。
我們來看看抽象工廠模式是怎么定義的:為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無需指定他們的具體類。同樣在下面的結(jié)構(gòu)圖中,我們可以更好地解釋這一定義。我們的抽象工廠中包含一系列的去構(gòu)造一個(gè)抽象產(chǎn)品的方法,而具體產(chǎn)品的實(shí)現(xiàn)則是放在了具體工廠(圖中的A和B)中進(jìn)行。
圖-2 抽象工廠模式
現(xiàn)在我們看看代碼中是如何實(shí)現(xiàn)的。
抽象工廠:
?
public abstract class AbstractFactory {public abstract Flyable createFlyable();public abstract Moveable createMoveable();public abstract Writeable createWriteable(); }?
具體工廠:
從抽象工廠的代碼中也可以看出,抽象工廠只是去“生產(chǎn)”一些抽象的東西。有點(diǎn)類似于底層機(jī)制的感覺。現(xiàn)在我們來看看具體工廠的實(shí)現(xiàn)。
public class Factory1 extends AbstractFactory {@Overridepublic Flyable createFlyable() {return new Aircraft();}@Overridepublic Moveable createMoveable() {return new Car();}@Overridepublic Writeable createWriteable() {return new Pen();}}?
抽象產(chǎn)品接口:
在具體工廠里,我們就可以生產(chǎn)一些具體的產(chǎn)品了。就是這里的Aircraft、Car、Pen。抽象的產(chǎn)品接口如下。
?
public interface Flyable {public void fly(int height); }?
具體產(chǎn)品:
具體的產(chǎn)品則是要去實(shí)現(xiàn)這個(gè)接口,并實(shí)現(xiàn)其中的方法,如下:
?
public class Aircraft implements Flyable {@Overridepublic void fly(int height) {System.out.println("我是一架客運(yùn)機(jī),我目前的飛行高度為:" + height + "千米。");}}?
功能測試:
有了這些東西,那么我們就來好好生產(chǎn)一些產(chǎn)品吧。
?
public class FactoryTest {public static void main(String[] args) {AbstractFactory factory = new Factory1();Flyable flyable = factory.createFlyable();flyable.fly(1589);Moveable moveable = factory.createMoveable();moveable.run(87.6);Writeable writeable = factory.createWriteable();writeable.write("Hello World.");} }? 現(xiàn)在讓我們來看一下,結(jié)果是否跟我們想的一樣吧。
?
?
圖-3 抽象工廠模式運(yùn)行結(jié)果圖
?
?
?
總結(jié)
以上就是工廠模式的基本實(shí)現(xiàn)和詳細(xì)說明。包括了簡單工廠模式、工廠方法模式、抽象工廠模式。我們可以基于需求來選擇合適的工廠模式。下面給出本文的所有代碼的GitHub鏈接。
?
GitHub源碼鏈接
https://github.com/qwhai/design-pattern
總結(jié)
以上是生活随笔為你收集整理的Java设计模式——工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络爬虫:基于对象持久化实现爬虫现场快速
- 下一篇: Java设计模式——Builder模式