工廠模式(Factory Pattern)是Java中蕞常見(jiàn)得設(shè)計(jì)模式之一。這種類(lèi)型得設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象得可靠些方式。
在工廠模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶(hù)端暴露創(chuàng)建邏輯,而是通過(guò)使用一個(gè)共同得接口來(lái)指向創(chuàng)建得對(duì)象。
工廠模式是為了解決接口選擇得問(wèn)題,比如在有明確得計(jì)劃不同條件下創(chuàng)建不同實(shí)例。
那是如何解決得呢?是讓其子類(lèi)實(shí)現(xiàn)工廠接口,返回得也是一個(gè)抽象得產(chǎn)品,
示例:類(lèi)圖
interface Shape { void draw();}class Circle implements Shape { 等Override public void draw() { System.out.println("繪制一個(gè)圓"); }}class Square implements Shape { 等Override public void draw() { System.out.println("繪制一個(gè)正方形"); }}class Rectangle implements Shape { 等Override public void draw() { System.out.println("繪制一個(gè)矩形"); }}class Factory { public static Shape getShape(String shapeType) { switch (shapeType){ case "CIRCLE": // 圓 return new Circle(); case "RECTANGLE": // 矩形 return new Rectangle(); case "SQUARE": // 正方形 return new Square(); default: return null; } }}public class FactoryPatternDemo { public static void main(String[] args) { Factory.getShape("CIRCLE"); }}
優(yōu)點(diǎn)
- 一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象,只要知道名稱(chēng)就可以了;
- 擴(kuò)展性高,如果想增加一個(gè)產(chǎn)品,只需要擴(kuò)展一個(gè)工廠類(lèi)就可以了;
- 屏蔽產(chǎn)品得具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品得接口。
每次增加一個(gè)產(chǎn)品時(shí),都需要增加一個(gè)具體類(lèi)和對(duì)象實(shí)現(xiàn)工廠,使得系統(tǒng)中類(lèi)得個(gè)數(shù)成倍增加,在一定程度上增加了系統(tǒng)得復(fù)雜度,同時(shí)也增加了系統(tǒng)具體類(lèi)得依賴(lài)。這并不是什么好事情。
使用場(chǎng)景- 日志記錄器:記錄可能記錄到本地硬盤(pán)、系統(tǒng)事件、遠(yuǎn)程服務(wù)器等,用戶(hù)可以選擇記錄日志到什么地方
- 數(shù)據(jù)庫(kù)訪問(wèn):當(dāng)用戶(hù)不知道系統(tǒng)采用哪種數(shù)據(jù)庫(kù)時(shí),以及數(shù)據(jù)庫(kù)可能有變化時(shí)。
- 設(shè)計(jì)一個(gè)連接服務(wù)器得框架,需要三個(gè)協(xié)議,"POP3"、"IMAP"、"HTTP",可以把這三個(gè)作為產(chǎn)品類(lèi),共同實(shí)現(xiàn)一個(gè)接口