引言
??上一回怎么說了工廠方法模式,這回咱們來講一講工廠模式的另外一種表現(xiàn),今天的主角"抽象工廠模式"。
示例地址
??Demo
先上類圖
image
看看定義
??為創(chuàng)建一組相關(guān)或者相互依賴的對象提供一個(gè)接口,而不需要指定它們的具體類。
使用場景
??一個(gè)對象族有相同的約束時(shí)可以使用抽象工廠模式。
抽象工廠中的2個(gè)概念
產(chǎn)品族
??位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。代表的是縱向結(jié)構(gòu)。
??舉個(gè)例子,華為有華為筆記本,華為手機(jī),華為手環(huán)等,小米也有小米手機(jī),小米筆記本,小米手環(huán)。華為這個(gè)系列的構(gòu)成了家族。稱為產(chǎn)品族。
產(chǎn)品等級(jí)
??產(chǎn)品等級(jí)結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu)。代表的是橫向結(jié)構(gòu)。
??舉個(gè)列子,一個(gè)抽象類手機(jī),下面可以生成小米手機(jī)、華為手機(jī)。
產(chǎn)品族與產(chǎn)品等級(jí)圖
image
產(chǎn)品類
1. 手機(jī)
/**
* 手機(jī)
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:19.
*/
public interface IPhone {
void phone();
}
/**
* 小米手機(jī)
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:25.
*/
public class XiaomiPhone implements IPhone {
@Override
public void phone() {
System.out.println("小米手機(jī)");
}
}
/**
* 華為手機(jī)
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:23.
*/
public class HuaweiPhone implements IPhone {
@Override
public void phone() {
System.out.println("華為手機(jī)");
}
}
2. 筆記本
/**
* 筆記本
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:27.
*/
public interface IComputer {
void computer();
}
/**
* 小米筆記本
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:44.
*/
public class XiaomiComputer implements IComputer {
@Override
public void computer() {
System.out.println("小米筆記本");
}
}
/**
* 華為筆記本
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:37.
*/
public class HuaweiComputer implements IComputer {
@Override
public void computer() {
System.out.println(" 華為筆記本");
}
}
3. 手環(huán)
/**
* 手環(huán)
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:55.
*/
public interface IBracelet {
void bracelet();
}
/**
* 小米手環(huán)
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:59.
*/
public class XiaomiBracelet implements IBracelet {
@Override
public void bracelet() {
System.out.println("小米手環(huán)");
}
}
/**
* 華為手環(huán)
*
* @author 512573717@qq.com
* @created 2018/7/9 上午10:57.
*/
public class HuaweiBracelet implements IBracelet {
@Override
public void bracelet() {
System.out.println("華為手環(huán)");
}
}
4. 工廠類
/**
* 抽象工廠
* @author 512573717@qq.com
* @created 2018/7/9 上午10:16.
*/
public abstract class ProductFactory {
// 創(chuàng)建手機(jī)
public abstract IPhone createPhone();
// 創(chuàng)建筆記本
public abstract IComputer createComputer();
// 創(chuàng)建手環(huán)
public abstract IBracelet createBracelet();
}
/**
* 小米
*
* @author 512573717@qq.com
* @created 2018/7/9 上午11:09.
*/
public class Xiaomi extends ProductFactory {
@Override
public IPhone createPhone() {
return new XiaomiPhone();
}
@Override
public IComputer createComputer() {
return new XiaomiComputer();
}
@Override
public IBracelet createBracelet() {
return new XiaomiBracelet();
}
}
/**
* 華為
*
* @author 512573717@qq.com
* @created 2018/7/9 上午11:03.
*/
public class Huawei extends ProductFactory {
@Override
public IPhone createPhone() {
return new HuaweiPhone();
}
@Override
public IComputer createComputer() {
return new HuaweiComputer();
}
@Override
public IBracelet createBracelet() {
return new HuaweiBracelet();
}
}
5. Client測試
//華為系列
System.out.println("華為");
ProductFactory huawei = new Huawei();
huawei.createPhone().phone();
huawei.createComputer().computer();
huawei.createBracelet().bracelet();
//小米系列
System.out.println("小米");
ProductFactory xiaomi=new Xiaomi();
xiaomi.createPhone().phone();
xiaomi.createComputer().computer();
xiaomi.createBracelet().bracelet();
總結(jié)
??抽象工廠模式是某一系列的產(chǎn)品的工廠。可以創(chuàng)建多個(gè)不同類型的產(chǎn)品。例如上面所說的 華為是一個(gè)產(chǎn)品工廠,能夠創(chuàng)建手機(jī) 、筆記本、手機(jī)等多個(gè)類型的產(chǎn)品。
抽象工廠 與工廠方法的區(qū)別
??工廠方法模式針對的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu);而抽象工廠模式則需要面對多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。