1. 程式人生 > 實用技巧 >脫殼實戰-殼程式碼分析

脫殼實戰-殼程式碼分析

技術標籤:設計模式設計模式抽象工廠模式

抽象工廠模式的定義

抽象工廠模式(Abstract Factory Pattern)指提供一個建立一系列相關或相互依賴物件的介面,無須指定它們具體的類。意思是客戶端不必指定產品的具體型別,建立多個產品族中的產品物件。

在抽象工廠模式中,客戶端(應用層)不依賴產品類例項如何被建立、實現等細節,強調一系列相關的產品物件(屬於同一產品族)一起建立物件,需要大量重複的程式碼。

需要提供一個產品類的庫,所有產品以同樣的接口出現,從而使客戶端不依賴具體實現。

抽象工廠模式主要包含4個角色

  1. 抽象工廠(IAbstractFactory):宣告建立抽象產品物件的一個操作介面。
  2. 具體工廠(ConcreteFactory):實現建立具體產品物件的操作。
  3. 抽象產品(IAbstractProduct):為一類產品物件宣告一個介面。
  4. 具體產品(ConcreteProduct):定義一個將被相應的具體工廠建立的產品物件,實現AbstractProduct介面。

示例

  • 產品A抽象
package com.liguogang.AbstractFactoryPattern;
/**
* @Description: 產品A抽象
* @Author:      LiGuoGang
* @date:    2021/1/8 20:41
*/
public interface IProductA {
    void
doA(); }
  • 產品B抽象
package com.liguogang.AbstractFactoryPattern;
/**
* @Description: 產品B抽象
* @Author:      LiGuoGang
* @date:    2021/1/8 20:41
*/
public interface IProductB {
    void doB();
}

  • 抽象工廠
package com.liguogang.AbstractFactoryPattern;
/**
* @Description: 抽象工廠
* @Author:      LiGuoGang
* @date:    2021/1/8 20:44
*/
public interface IFactory { IProductA makeProductA(); IProductB makeProductB(); }
  • 工廠A的具體產品A
package com.liguogang.AbstractFactoryPattern;
/**
* @Description: 工廠A的具體產品A
* @Author:      LiGuoGang
* @date:    2021/1/8 20:49
*/
public class ConcreteProductAWithFactoryA implements IProductA {
    @Override
    public void doA() {
        System.out.println("工廠A, 生產, 產品A");
    }
}
  • 工廠A的具體產品B
package com.liguogang.AbstractFactoryPattern;
/**
* @Description: 工廠A的具體產品B
* @Author:      LiGuoGang
* @date:    2021/1/8 20:49
*/
public class ConcreteProductBWithFactoryA implements IProductB {

    @Override
    public void doB() {
        System.out.println("工廠A, 生產, 產品B");
    }
}
  • 工廠B的具體產品A
package com.liguogang.AbstractFactoryPattern;
/**
* @Description: 工廠B的具體產品A
* @Author:      LiGuoGang
* @date:    2021/1/8 20:49
*/
public class ConcreteProductAWithFactoryB implements IProductA {
    @Override
    public void doA() {
        System.out.println("工廠B, 生產, 產品A");
    }
}
  • 工廠B的具體產品B
package com.liguogang.AbstractFactoryPattern;
/**
* @Description: 工廠B的具體產品B
* @Author:      LiGuoGang
* @date:    2021/1/8 20:49
*/
public class ConcreteProductBWithFactoryB implements IProductB {

    @Override
    public void doB() {
        System.out.println("工廠B, 生產, 產品B");
    }
}
  • 具體工廠類A
package com.liguogang.AbstractFactoryPattern;
/**
* @Description: 具體工廠類A
* @Author:      LiGuoGang
* @date:    2021/1/8 20:58
*/
public class ConcreteFactoryA implements IFactory {
    @Override
    public IProductA makeProductA() {
        return new ConcreteProductAWithFactoryA();
    }

    @Override
    public IProductB makeProductB() {
        return new ConcreteProductBWithFactoryA();
    }
}

  • 客戶端呼叫測試
package com.liguogang.AbstractFactoryPattern;

public class Test {
    public static void main(String[] args) {
        IFactory factory = new ConcreteFactoryA();
        factory.makeProductA().doA();
        factory.makeProductB().doB();

        factory = new ConcreteFactoryB();
        factory.makeProductA().doA();
        factory.makeProductB().doB();
    }
}


效果:
在這裡插入圖片描述
原始碼地址:https://github.com/lee58/designPattern/tree/master