23天設計模式之抽象工廠模式
文章簡介
《23天設計模式之抽象工廠模式》這是跟工廠模式相關的一篇文章,但是抽象工廠又是不同于工廠模式的,抽象工廠是圍繞一個超級工廠去創建其它工廠,下面就一起來看看吧!
抽象工廠模式
定義
-
屬于創建型模式,用于產品族的構建,產品族指的是某個品牌下的不同系類產品,如華為下的手機、電視、電腦等系列合起來就是華為的產品族,
-
抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體情況下,創建多個產品族中的產品物件,
-
區別:工廠方法模式是一個產品系列一個工廠類,而抽象工廠模式是多個產品系列一個工廠類,
通俗理解就是:
工廠方法模式中,有一個華為手機工廠類,這個工廠只能提供華為手機這一種產品,也就是只能提供華為手機,不能提供華為TV,
而抽象工廠中,有一個華為工廠類,這個工廠既能提供華為手機,也能提供華為TV,也就是華為系列的所有產品都能提供,
上文所指的產品系列指的是,華為手機是一個產品系列,華為TV是另一個產品系列,
-
增加新產品必須修改原有代碼,不符合開閉原則,增加新產品族不用修改原有代碼,
角色
- 抽象產品角色:描述產品有什么功能,一般用介面或抽象類表示,如 手機介面
- 具體產品角色:實作抽象產品角色的類,是真實的產品,如 華為手機
- 抽象工廠角色:描述產品族,表示具體工廠可以生產的所有產品,
- 具體工廠角色:實作抽象工廠角色的類,用于客戶端呼叫創建產品實體,
代碼實作
- 抽象產品角色
public interface Phone {
void call();
void send(String msg);
}
public interface TV {
// 播放
void play();
// 選擇頻道
void choose(int channel);
}
- 具體產品角色
public class HuaweiPhone implements Phone{
@Override
public void call() {
System.out.println("HuaweiPhone call...");
}
@Override
public void send(String msg) {
System.out.println("HuaweiPhone send... " + msg);
}
}
public class HuaweiTV implements TV{
@Override
public void play() {
System.out.println("HuaweiTV play...");
}
@Override
public void choose(int channel) {
System.out.println("HuaweiTV choose... " + channel);
}
}
public class XiaomiPhone implements Phone{
@Override
public void call() {
System.out.println("XiaomiPhone call...");
}
@Override
public void send(String msg) {
System.out.println("XiaomiPhone send... " + msg);
}
}
public class XiaomiTV implements TV{
@Override
public void play() {
System.out.println("XiaomiTV play...");
}
@Override
public void choose(int channel) {
System.out.println("XiaomiTV choose... " + channel);
}
}
- 抽象工廠角色
public interface AbstractFactory {
Phone getPhone();
TV getTV();
}
- 具體工廠角色
public class HuaweiFactory implements AbstractFactory{
@Override
public Phone getPhone() {
return new HuaweiPhone();
}
@Override
public TV getTV() {
return new HuaweiTV();
}
}
public class XiaomiFactory implements AbstractFactory{
@Override
public Phone getPhone() {
return new XiaomiPhone();
}
@Override
public TV getTV() {
return new XiaomiTV();
}
}
- 客戶端測驗
public class Client {
public static void main(String[] args) {
// 獲得每個品牌的工廠
HuaweiFactory huaweiFactory = new HuaweiFactory();
XiaomiFactory xiaomiFactory = new XiaomiFactory();
// 獲取不同品牌的產品,可以發現,這里獲取到的產品都使用了向上轉型,客戶可以通過抽象介面操縱實體
Phone huaweiPhone = huaweiFactory.getPhone();
Phone xiaomiPhone = xiaomiFactory.getPhone();
TV huaweiTV = huaweiFactory.getTV();
TV xiaomiTV = xiaomiFactory.getTV();
huaweiPhone.call();
huaweiPhone.send("Huawei 你好");
xiaomiPhone.call();
xiaomiPhone.send("Xiaomi 你好");
huaweiTV.choose(1);
huaweiTV.play();
xiaomiTV.choose(2);
xiaomiTV.play();
}
}
HuaweiPhone call...
HuaweiPhone send... Huawei 你好
XiaomiPhone call...
XiaomiPhone send... Xiaomi 你好
HuaweiTV choose... 1
HuaweiTV play...
XiaomiTV choose... 2
XiaomiTV play...
Process finished with exit code 0
優缺點分析
-
優點:
- 分離了具體的類,客戶通過抽象介面操縱實體,產品的類名也在具體工廠的實作中被分離,它們不出現在客戶代碼中,
- 易于交換產品系列,一個具體工廠類只在初始化時出現一次,這使得改變一個應用的具體工廠變得很容易,只需改變具體的工廠即可使用不同的產品配置,
- 有利于產品的一致性,當一個系列的產品物件被設計成一起作業時,一個應用一次只能使用同一個系列中的物件,這一點很重要,而抽象工廠很容易實作這一點,
-
缺點:
- 難以支持新種類的產品,因為抽象工廠介面確定了可以被創建的產品集合,所以難以擴展抽象工廠以生產新種類的產品,
以上
感謝您花時間閱讀我的博客,以上就是我對抽象工廠模式的一些理解,若有不對之處,還望指正,期待與您交流,
本篇博文系原創,僅用于個人學習,轉載請注明出處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288716.html
標籤:其他
