脫殼實戰-殼程式碼分析
阿新 • • 發佈:2020-12-31
抽象工廠模式的定義
抽象工廠模式(Abstract Factory Pattern)指提供一個建立一系列相關或相互依賴物件的介面,無須指定它們具體的類。意思是客戶端不必指定產品的具體型別,建立多個產品族中的產品物件。
在抽象工廠模式中,客戶端(應用層)不依賴產品類例項如何被建立、實現等細節,強調一系列相關的產品物件(屬於同一產品族)一起建立物件,需要大量重複的程式碼。
需要提供一個產品類的庫,所有產品以同樣的接口出現,從而使客戶端不依賴具體實現。
抽象工廠模式主要包含4個角色
- 抽象工廠(IAbstractFactory):宣告建立抽象產品物件的一個操作介面。
- 具體工廠(ConcreteFactory):實現建立具體產品物件的操作。
- 抽象產品(IAbstractProduct):為一類產品物件宣告一個介面。
- 具體產品(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