android設計模式——抽象工廠模式
阿新 • • 發佈:2018-11-06
定義:為建立一組相關或者是互相以來的物件提供一個介面,而不需要指定他們的具體的類,
使用場景:
在任何需要生成複雜物件的地方,都可以使用工廠方法模式.
應用舉例: 不同牌子的汽車工廠生產不同的汽車
類圖:
- AbstractFactory,抽象的工廠類
- ConcreteFactory,具體的工廠類
- Product,抽象的產品類
- ConcreteProduct,具體的產品類
關鍵程式碼:在一個工廠裡聚合多個同類產品。
優點:
- 當一個產品族中的多個物件被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的物件。
缺點:
- 產品族擴充套件非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加程式碼,又要在具體的裡面加程式碼。
abstract class AbstractProductA{ public abstract void method(); } abstract class AbstractProductB{ public abstract void method(); } class ConcreteProductA1 extends AbstractProductA{ @Override public void method() { // TODO 自動生成的方法存根 System.out.println("具體產品A1的製作方法"); } } class ConcreteProductA2 extends AbstractProductA{ @Override public void method() { // TODO 自動生成的方法存根 System.out.println("具體產品A2的製作方法"); } } class ConcreteProductB1 extends AbstractProductB{ @Override public void method() { // TODO 自動生成的方法存根 System.out.println("具體產品B1的製作方法"); } } class ConcreteProductB2 extends AbstractProductB{ @Override public void method() { // TODO 自動生成的方法存根 System.out.println("具體產品B2的製作方法"); } } abstract class AbstractFactory{ public abstract AbstractProductA creatAbstractProductA(); public abstract AbstractProductB creatAbstractProductB(); } class ConcreteFactory1 extends AbstractFactory{ @Override public AbstractProductA creatAbstractProductA() { // TODO 自動生成的方法存根 return new ConcreteProductA1(); } @Override public AbstractProductB creatAbstractProductB() { // TODO 自動生成的方法存根 return new ConcreteProductB1(); } } class ConcreteFactory2 extends AbstractFactory{ @Override public AbstractProductA creatAbstractProductA() { // TODO 自動生成的方法存根 return new ConcreteProductA2(); } @Override public AbstractProductB creatAbstractProductB() { // TODO 自動生成的方法存根 return new ConcreteProductB2(); } }
public static void main(String[] args) { // TODO 自動生成的方法存根 AbstractFactory factory1 = new ConcreteFactory1(); AbstractFactory factory2 = new ConcreteFactory2(); AbstractProductA productA= factory1.creatAbstractProductA(); AbstractProductB productB = factory2.creatAbstractProductB(); productA.method(); productB.method(); }