### 抽象工廠模式
提供一個創建一系列相關或互相依賴對象的接口,而無需指定它們具體的類。(摘抄)
抽象工廠模式是工廠模式的一種拓展吧——這個工廠需要創建多個類,而這些類共同組成一個系列
~~~
//首先確定好產品的抽象類
public abstract class AbstractProductA
{
}
public abstract class AbstractProductB
{
}
//A和B組成一個系列產品
public class ProductA1 extends AbstractProductA
{
}
public class ProductB1 extends AbstractProductB
{
}
public class ProductA2 extends AbstractProductA
{
}
public class ProductB2 extends AbstractProductB
{
}
//產品類定義完了之后開始定義工廠類
public abstract class AbstractFactory
{
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
public class ConcreteFactory1 extends AbstractFactory
{
@Override
public AbstractProductA createProductA() {
// TODO Auto-generated method stub
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
// TODO Auto-generated method stub
return new ProductB1();
}
}
public class ConcreteFactory2 extends AbstractFactory
{
@Override
public AbstractProductA createProductA() {
// TODO Auto-generated method stub
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
// TODO Auto-generated method stub
return new ProductB2();
}
}
class Client
{
public static void main()
{
// AbstractFactory factory = new ConcreteFactory2();
AbstractFactory factory = new ConcreteFactory1();
AbstractProductA productA = factory.createProductA();
AbstractProductB productB = factory.createProductB();
}
}
~~~
抽象工廠模式好處有兩點:
1.工廠只需要初始化一次,當產品需要替換的時候只需要替換很少的代碼
2.客戶端在使用的時候都是通過抽象接口在操縱實例,具體的類沒有暴露在外面
缺點:
同樣也是工廠模式的缺點,就是增加一個產品的時候需要增加很多類和代碼。
### 解決辦法:
1.用簡單工廠模式,當增加功能的時候只需要增加switch case語句,但是違背了開放-封閉原則,而且由于需要生產的類很多,所以switch case也會很多,所以不可取。
2.用反射機制,動態的去生產所需要的類
~~~
public class AbstractFactory
{
private String s;
public AbstractFactory(String s)
{
this.s = s;
}
public AbstractProductA createProductA()
{
return (AbstractProductA) Class.forName("ProductA"+s).newInstance();
}
public AbstractProductB createProductB()
{
return (AbstractProductB) Class.forName("ProductB"+s).newInstance();
}
}
class Client
{
public static void main()
{
AbstractFactory factory = new AbstractFactory("1");
AbstractProductA productA = factory.createProductA();
AbstractProductB productB = factory.createProductB();
}
}
~~~
當需要添加一個功能的時候在工廠類中增加一個生產方法就好了
在簡單工廠模式中用到switch case的地方也可以考慮用反射機制來解除耦合。
- 前言
- (1)代碼無錯就是優?——簡單工廠模式
- (2)商場促銷——策略模式
- (3)&(4)&(5) 設計模式原則
- (6)穿什么有這么重要?——裝飾模式
- (7)為別人做嫁衣——代理模式
- (8)雷鋒依然在人間——工廠方法模式
- (9)簡歷復印——原型模式
- (10)考題抄錯會做也白搭——模板方法模式
- (11)迪米特法則
- (12)牛市股票還會虧錢?—— 外觀模式
- (13)好菜每回味不同——建造者模式
- (14)老板回來,我不知道——觀察者模式
- java實現事件委托
- (15)就不能不還DB嗎?—— 抽象工廠模式
- (16)無盡加班何時休息——狀態模式
- (17)在NBA我需要翻譯——適配器模式
- (18)如果再回到從前——備忘錄模式
- (19)分公司=部門——組合設計模式
- (20)想走?可以!先買票——迭代器模式
- (21)有些類也需計劃生育——單例模式
- (22)手機軟件何時統一——橋接模式
- (23)烤羊肉串引來的思考——命令模式
- (24)加薪非要老總批?——職責鏈模式
- (25)世界需要和平——中介者模式
- (26)項目多也別傻做——享元模式
- (28)男人和女人——訪問者模式