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