抽象工厂模式_设计模式——抽象工厂模式
閱讀目錄
- 使用頻率:★★★★★
- 一、什么是抽象工廠(chǎng)模式
- 二、補(bǔ)充說(shuō)明
- 三、角色
- 四、例子
使用頻率:★★★★★
一、什么是抽象工廠(chǎng)模式
就是對(duì)一組具有相同主題的工廠(chǎng)進(jìn)行封裝(維基百科解釋的很到位);
例如:生產(chǎn)一臺(tái)PC機(jī),使用工廠(chǎng)方法模式的話(huà),一般會(huì)有cpu工廠(chǎng),內(nèi)存工廠(chǎng),顯卡工廠(chǎng)...但是使用抽象工廠(chǎng)模式的話(huà),只有一個(gè)工廠(chǎng)就是PC工廠(chǎng),但是一個(gè)PC工廠(chǎng)涵蓋了cpu工廠(chǎng),內(nèi)存工廠(chǎng),顯卡工廠(chǎng)等要做的所有事;
二、補(bǔ)充說(shuō)明
- 注意這里的“相同主題”的概念,表示的是同一個(gè)產(chǎn)品族,不能將cpu工廠(chǎng),面粉工廠(chǎng)封裝成一個(gè)工廠(chǎng),因?yàn)樗麄儾粚儆谕粋€(gè)產(chǎn)品族;
- 另外,還有一個(gè)產(chǎn)品等級(jí)的概念,還是以生產(chǎn)PC機(jī)為例,所謂的產(chǎn)品等級(jí)指的是不同廠(chǎng)商生產(chǎn)的CPU,如Intel和AMD的CPU,他們是同一個(gè)產(chǎn)品等級(jí),如果只涉及產(chǎn)品等級(jí)的話(huà),是不需要應(yīng)用抽象工廠(chǎng)模式,使用工廠(chǎng)方法模式即可;
- 工廠(chǎng)方法模式解決的范疇是產(chǎn)品等級(jí)(AMD處理器,Intel處理器等);抽象工廠(chǎng)模式解決的范疇是產(chǎn)品族等級(jí)(聯(lián)想PC、惠普PC等);
三、角色
- 抽象工廠(chǎng)
- 具體工廠(chǎng)
- 抽象產(chǎn)品
- 具體產(chǎn)品
- 產(chǎn)品使用者
說(shuō)明:
- 具體工廠(chǎng)“繼承”抽象工廠(chǎng);
- 具體產(chǎn)品”繼承“抽象產(chǎn)品;
- 每個(gè)具體工廠(chǎng)(如PC工廠(chǎng))包含若干個(gè)子工廠(chǎng)方法(如cpu工廠(chǎng)方法、顯卡工廠(chǎng)方法...),子工廠(chǎng)方法負(fù)責(zé)生產(chǎn)對(duì)應(yīng)的具體子產(chǎn)品,所有具體子產(chǎn)品(cpu、內(nèi)存、顯卡...)組合成一個(gè)具體產(chǎn)品(如惠普XXX型號(hào)PC);
- 產(chǎn)品使用者使用每個(gè)具體工廠(chǎng)生產(chǎn)的具體產(chǎn)品;
四、例子
這里就不用PC這個(gè)例子了,繼續(xù)前一個(gè)工廠(chǎng)模式的例子,在上一篇工廠(chǎng)模式的例子中,我們使用的是創(chuàng)建父親對(duì)象這個(gè)例子,其中中國(guó)父親和美國(guó)父親指的就是同一個(gè)產(chǎn)品等級(jí);
但是當(dāng)我們要?jiǎng)?chuàng)建一個(gè)家庭對(duì)象的時(shí)候,需要?jiǎng)?chuàng)建父親對(duì)象、母親對(duì)象、孩子對(duì)象等等,所謂的父親、母親、孩子就構(gòu)成了一個(gè)產(chǎn)品族,中國(guó)家庭、美國(guó)家庭就是產(chǎn)品族等級(jí);這個(gè)時(shí)候就需要使用抽象工廠(chǎng)模式了;
類(lèi)之間的關(guān)系圖:
代碼實(shí)現(xiàn):
先創(chuàng)建抽象產(chǎn)品(抽象母親、抽象父親),具體產(chǎn)品(具體母親、具體父親):
package com.pichen.dp.creationalpattern.abstractfactory;public interface IMother { public void printName();}package com.pichen.dp.creationalpattern.abstractfactory;public interface IFather { public void printName();}?
package com.pichen.dp.creationalpattern.abstractfactory;public class ChineseMother implements IMother{ private String name; public ChineseMother(String name) { this.name = name; System.out.println("create a cn mother."); } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } @Override public void printName() { System.out.println(this.getClass().getName() + ":" + this.name); }}?
?
package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanMother implements IMother{ private String name; public AmericanMother(String name) { this.name = name; System.out.println("create a us mother."); } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } @Override public void printName() { System.out.println(this.getClass().getName() + ":" + this.name); }}?
?
package com.pichen.dp.creationalpattern.abstractfactory;public class ChineseFather implements IFather{ private String name; public ChineseFather(String name) { this.name = name; System.out.println("create a cn father."); } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } @Override public void printName() { System.out.println(this.getClass().getName() + ":" + this.name); }}?
?
package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanFather implements IFather{ private String name; public AmericanFather(String name) { this.name = name; System.out.println("create a us father."); } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } @Override public void printName() { System.out.println(this.getClass().getName() + ":" + this.name); }}?
創(chuàng)建一個(gè)抽象家庭工廠(chǎng)接口:
?
package com.pichen.dp.creationalpattern.abstractfactory;/** * * abstract factory * father + mother + sister + ... = Product Family * cnfather + usfather + ukfather + ... = Product grade //factory method * 〈功能詳細(xì)描述〉 * @author pi chen * @version cp-lib V1.0.0, 2015年11月25日 * @see * @since cp-lib V1.0.0 */public interface IFamilyFactory { public IFather createFather(String name); public IMother createMother(String name);}?
分別創(chuàng)建具體的中國(guó)家庭工廠(chǎng)和美國(guó)家庭工廠(chǎng):
?
package com.pichen.dp.creationalpattern.abstractfactory;public class ChineseFamilyFactory implements IFamilyFactory{ @Override public IFather createFather(String name) { return new ChineseFather(name); } @Override public IMother createMother(String name) { return new ChineseMother(name); }}?
?
package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanFamilyFactory implements IFamilyFactory{ @Override public IFather createFather(String name) { return new AmericanFather(name); } @Override public IMother createMother(String name) { return new AmericanMother(name); }}?
創(chuàng)面產(chǎn)品使用者main方法:
?
package com.pichen.dp.creationalpattern.abstractfactory;public class Main { public static void main(String[] args) { IFamilyFactory cnFamilyFactory = new ChineseFamilyFactory(); IFamilyFactory usFamilyFactory = new AmericanFamilyFactory(); IFather cnFather = cnFamilyFactory.createFather("cn father-test"); IMother cnMother = cnFamilyFactory.createMother("cn mother-test"); IFather usFather = usFamilyFactory.createFather("us father-test"); IMother usMother = usFamilyFactory.createMother("us mother-test"); cnFather.printName(); cnMother.printName(); usFather.printName(); usMother.printName(); }}?
結(jié)果打印如下,功能正常:
create a cn father.
create a cn mother.
create a us father.
create a us mother.
com.pichen.dp.creationalpattern.abstractfactory.ChineseFather:cn father-test
com.pichen.dp.creationalpattern.abstractfactory.ChineseMother:cn mother-test
com.pichen.dp.creationalpattern.abstractfactory.AmericanFather:us father-test
com.pichen.dp.creationalpattern.abstractfactory.AmericanMother:us mother-test
總結(jié)
以上是生活随笔為你收集整理的抽象工厂模式_设计模式——抽象工厂模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 度量计算机外部传输单位,用来度量计算机外
- 下一篇: if mybatis tk 多个_面试题