設(shè)計(jì)模式——簡(jiǎn)單工廠

精選推薦:設(shè)計(jì)模式——觀察者模式設(shè)計(jì)模式——裝飾者模式
作為工廠模式的入門(mén),簡(jiǎn)單工廠準(zhǔn)確的來(lái)說(shuō)其實(shí)不算是一個(gè)設(shè)計(jì)模式,反而比較像是一種編程習(xí)慣。其通過(guò)將對(duì)象的創(chuàng)建細(xì)節(jié)提取到一個(gè)特有的類(lèi),這個(gè)我們稱(chēng)之為工廠類(lèi),來(lái)完成對(duì)象創(chuàng)建與業(yè)務(wù)功能的解耦。提取出來(lái)的工廠類(lèi),也可以被多個(gè)模塊復(fù)用。
類(lèi)圖

代碼實(shí)現(xiàn)
我們還是以咖啡店為例。
一個(gè)咖啡店可以售賣(mài)多種咖啡,比如摩卡、拿鐵……,而這每種咖啡可以看作是一個(gè)對(duì)象實(shí)例,都需要咖啡店這個(gè)工廠來(lái)創(chuàng)建,客戶只需要將想喝的咖啡告訴咖啡店,咖啡店就可以提供不同的咖啡,如果以后又增加了新的咖啡品種,比如卡布奇諾,也只需要咖啡店更新產(chǎn)品而已,對(duì)于客戶并不要任何的改變就可以提供,同一個(gè)客戶可以享受到更多的咖啡品種。
而這個(gè)咖啡店呢,可以線下運(yùn)營(yíng),也可以同時(shí)增加線上運(yùn)營(yíng),比如美團(tuán)團(tuán)購(gòu)……這個(gè)就類(lèi)似多個(gè)模塊對(duì)工廠的復(fù)用。
下面我們用代碼來(lái)實(shí)現(xiàn):
package com.study.design.Factory.abstractfactory;/*** 實(shí)例對(duì)象接口* 咖啡*/public interface Coffe {String coffeName();}
package com.study.design.Factory.abstractfactory;/*** 具體實(shí)例類(lèi)* 拿鐵咖啡*/public class LatteCoffe implements Coffe{public String coffeName() {return "latte";}}
package com.study.design.Factory.abstractfactory;/*** 具體實(shí)例類(lèi)* 摩卡咖啡*/public class MochaCoffe implements Coffe{public String coffeName() {return "mocha";}}
package com.study.design.Factory.abstractfactory;/*** 簡(jiǎn)單工廠類(lèi)*/public class SimpleFactory {/*** 我們這里簡(jiǎn)單定義* 如果傳入類(lèi)型為 1, 則表示獲取摩卡咖啡對(duì)象,其他都是拿鐵* @param type 需要的咖啡類(lèi)型* @return*/public Coffe productCoffe(int type){if (type == 1){return new MochaCoffe();}else{return new LatteCoffe();}}}
package com.study.design.Factory.abstractfactory;/*** 消費(fèi)者*/public class Customer {private SimpleFactory simpleFactory;/* 構(gòu)造方法中綁定工廠實(shí)例* 也可以通過(guò)別的方式,比如 set 方法*/public Customer(SimpleFactory simpleFactory){this.simpleFactory = simpleFactory;}/*客戶需求*/public void drink(int type){Coffe coffe = simpleFactory.productCoffe(type);System.out.println("I got a cup of " + coffe.coffeName());}}
package com.study.design.Factory.abstractfactory;public class SimpleFactoryTest {public static void main(String[] args) {// 創(chuàng)建工廠對(duì)象-咖啡店SimpleFactory simpleFactory = new SimpleFactory();// 客戶-消費(fèi)者Customer customer = new Customer(simpleFactory);// 客戶不同的對(duì)象-不同的咖啡customer.drink(1);customer.drink(2);}}
要點(diǎn)
簡(jiǎn)單工廠,其實(shí)就是將創(chuàng)建對(duì)象的邏輯提取到另外一個(gè)類(lèi),稱(chēng)為工廠類(lèi),使創(chuàng)建對(duì)象的過(guò)程與使用者解耦,使用者通過(guò)傳送不同的參數(shù)給工廠類(lèi),工廠類(lèi)負(fù)責(zé)創(chuàng)建不同的對(duì)象并返回。體現(xiàn)了 Java 對(duì)象封裝的特點(diǎn)。
