創(chuàng)建型模式:對(duì)象實(shí)例化的模式似芝,創(chuàng)建型模式用于解耦對(duì)象的實(shí)例化過(guò)程那婉,即創(chuàng)建對(duì)象的同時(shí)隱藏創(chuàng)建邏輯。
在上一篇行為型模式之策略模式的最后党瓮,我們說(shuō)創(chuàng)建策略角色可以使用工廠模式來(lái)創(chuàng)建详炬,這里接著聊工廠模式。
工廠模式分為簡(jiǎn)單工廠模式寞奸,和抽象工廠模式呛谜。
簡(jiǎn)單工廠模式:建立一個(gè)工廠類(lèi),對(duì)實(shí)現(xiàn)了同一接口的一些類(lèi)進(jìn)行實(shí)例的創(chuàng)建枪萄。
首先接口和實(shí)例類(lèi)已經(jīng)有現(xiàn)成的了隐岛,我們并不做改動(dòng),如下
/**
* 抽象策略
**/
public interface PriceStrategy {
BigDecimal getPrice(BigDecimal price);
}
/**
* 會(huì)員,六折
**/
class Member implements PriceStrategy {
@Override
public BigDecimal getPrice(BigDecimal price) {
return price.multiply(new BigDecimal(0.6 + ""));
}
}
/**
* 普通客戶(hù) 原價(jià)
**/
class Ordinary implements PriceStrategy {
@Override
public BigDecimal getPrice(BigDecimal price) {
return price;
}
}
/**
* 超級(jí)會(huì)員,4折
**/
class SuperMember implements PriceStrategy {
@Override
public BigDecimal getPrice(BigDecimal price) {
return price.multiply(new BigDecimal(0.4+""));
}
}
接著創(chuàng)建一個(gè)工廠類(lèi)瓷翻,來(lái)進(jìn)行實(shí)例的創(chuàng)建
public class StrategyFactory {
public PriceStrategy produce(String memberType) {
if ("Member".equals(memberType)) {
return new Member();
} else if ("Ordinary".equals(memberType)) {
return new Ordinary();
}else if ("SuperMember".equals(memberType)) {
return new SuperMember();
}else {
System.out.println("請(qǐng)輸入正確的類(lèi)型!");
return null;
}
}
}
到這里聚凹,我們創(chuàng)建策略角色時(shí)割坠,可以使用簡(jiǎn)單工廠模式來(lái)創(chuàng)建
public class Test {
public static void main(String[] args) throws Exception {
//簡(jiǎn)單工廠模式,根據(jù)條件來(lái)創(chuàng)建實(shí)例
StrategyFactory factory = new StrategyFactory();
PriceStrategy strategy = factory.produce("SuperMember");
// 創(chuàng)建上下文環(huán)境
PriceContext priceContext = new PriceContext(strategy);
// 計(jì)算價(jià)格
BigDecimal price = priceContext.getPrice(300);
System.out.println("商品的最終價(jià)格為:" + price );
}
}
抽象工廠模式:可以生產(chǎn)多種相關(guān)聯(lián)產(chǎn)品的超級(jí)工廠(簡(jiǎn)單工廠模式只能上產(chǎn)一種產(chǎn)品)
假如我們?cè)儆?jì)算完商品價(jià)格之后妒牙,還要計(jì)算本次購(gòu)買(mǎi)積分彼哼,同樣的,積分的計(jì)算也是不同的策略/算法单旁,我們繼續(xù)使用策略模式再創(chuàng)建一組積分策略角色沪羔,這里不成問(wèn)題,問(wèn)題是我們還是需要使用簡(jiǎn)單工廠模式來(lái)創(chuàng)建積分實(shí)例象浑。這樣不但冗余蔫饰,而且代碼復(fù)用性不強(qiáng),這時(shí)候就可以使用抽象工廠模式愉豺,創(chuàng)建一個(gè)能生產(chǎn)多個(gè)對(duì)象的超級(jí)工廠篓吁。
先定義一個(gè)抽象工廠,
public interface IAbstractFactory {
/**
* 獲取價(jià)格策略
*/
PriceStrategy getPriceStrategy();
/**
* 獲取積分策略
*/
PointsStrategy getPointsStrategy();
}
定義具體的工廠生產(chǎn)類(lèi)蚪拦,具體的產(chǎn)品實(shí)例返回
會(huì)員工廠類(lèi)杖剪,生產(chǎn)會(huì)員價(jià)格策略實(shí)例,和會(huì)員積分策略實(shí)例
public class MemberFactory implements IAbstractFactory {
@Override
public PriceStrategy getPriceStrategy() {
return new Member();
}
@Override
public PointsStrategy getPointsStrategy() {
return new MemberPoints();
}
}
普通客戶(hù)工廠類(lèi)驰贷,生產(chǎn)普通客戶(hù)價(jià)格策略實(shí)例盛嘿,和普通客戶(hù)積分策略實(shí)例
public class OrdinaryFactory implements IAbstractFactory {
@Override
public PriceStrategy getPriceStrategy() {
return new Ordinary();
}
@Override
public PointsStrategy getPointsStrategy() {
return new OrdinaryPoints();
}
}
超級(jí)會(huì)員略
創(chuàng)建一個(gè)工廠創(chuàng)造器,通過(guò)傳遞會(huì)員類(lèi)型來(lái)獲取工廠
public class FactoryProducer {
public static IAbstractFactory getFactory(String memberType){
if ("Member".equals(memberType)) {
return new MemberFactory();
} else if ("Ordinary".equals(memberType)) {
return new OrdinaryFactory();
}else if ("SuperMember".equals(memberType)) {
return new SuperMemberFactory();
}else {
System.out.println("請(qǐng)輸入正確的類(lèi)型!");
return null;
}
}
}
測(cè)試
public class Test {
public static void main(String[] args) throws Exception {
//抽象工廠模式括袒,根據(jù)條件來(lái)創(chuàng)建工廠實(shí)例
IAbstractFactory factory = new FactoryProducer.getFactory("Member");
PriceStrategy priceStrategy = factory.getPriceStrategy();
PointsStrategy pointsStrategy = factory.getPointsStrategy();
// 創(chuàng)建價(jià)格策略上下文環(huán)境
PriceContext priceContext = new PriceContext(priceStrategy );
// 計(jì)算價(jià)格
BigDecimal price = priceContext.getPrice(300);
// 創(chuàng)建積分策略上下文環(huán)境
PointsContext pointsContext = new PointsContext(pointsStrategy );
// 計(jì)算積分
BigDecimal points = pointsContext.getPoints(300);
}
}
到此次兆,我們抽象工廠模式就完結(jié)了,從上面可以看出抽象工廠模式的主要特點(diǎn)锹锰,是創(chuàng)建一個(gè)超級(jí)工廠/抽象工廠芥炭,這個(gè)工廠是用來(lái)生產(chǎn)多個(gè)普通工廠的,每個(gè)普通工廠生產(chǎn)不同的實(shí)例恃慧,同時(shí)各個(gè)普通工廠又有業(yè)務(wù)上的關(guān)聯(lián)园蝠,比如共同完成某項(xiàng)業(yè)務(wù)。
簡(jiǎn)而言之痢士,就是可以生產(chǎn)多種相關(guān)聯(lián)產(chǎn)品的超級(jí)工廠(簡(jiǎn)單工廠模式只能上產(chǎn)一種產(chǎn)品)