目錄
概念
抽象工廠模式是一種爲訪問類提供一個創建一組相關或相互依賴對象的接口,且訪問類無須指定所要產品的具體類就能得到同族的不同等級的產品的模式結構。
抽象工廠是創建型設計模式,它強調了一系列相關產品對象(屬於同一個產品族)的創建過程,它和工廠方法模式的側重點不同,工廠方法模式更加側重於同一產品等級,而抽象工廠模式側重的是同一產品族。簡單說就是一個工廠中生產的一系列對象都是同一個產品族的。
改進方面
抽象工廠模式是工廠方法模式的升級版本,工廠方法模式只生產一個等級的產品,而抽象工廠模式可生產多個等級的產品。
特點
使用抽象工廠模式一般要滿足以下條件。
1、系統中有多個產品族,每個具體工廠創建同一族但屬於不同等級結構的產品。
2、系統一次只可能消費其中某一族產品,即同族的產品一起使用。
優缺點
優點
1、可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理。
2、當增加一個新的產品族時不需要修改原代碼,滿足開閉原則。
缺點
當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。
角色構成
抽象工廠
抽象工廠(Abstract Factory):提供了創建產品的接口,它包含多個創建產品的方法 newProduct(),可以創建多個不同等級的產品。
具體工廠
具體工廠(Concrete Factory):主要是實現抽象工廠中的多個抽象方法,完成具體產品的創建。
抽象產品
抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能,抽象工廠模式有多個抽象產品。
具體產品
具體產品(ConcreteProduct):實現了抽象產品角色所定義的接口,由具體工廠來創建,它同具體工廠之間是多對一的關係。
UML結構圖
代碼實現
抽象產品
IAirConditioner.java
package pattern.factory.absfactory.productsinterf;
import java.math.BigDecimal;
/**
* 〈一句話功能簡述〉抽象工廠方法:多個產品接口(抽象產品):空調接口<br>
* <p>
* 〈功能詳細描述〉
*
* @author 劉斌
* @date 2020/3/7
* @see [相關類/方法](可選)
* @since [產品/模塊版本] (可選)
*/
public interface IAirConditioner {
/**
* 空調生產商
*
* @return 空調生產商
*/
String airConditionProducer();
/**
* 空調生產日期
*
* @return 空調生產日期
*/
String airConditionCreateDate();
/**
* 空調價格
*
* @return 空調價格
*/
BigDecimal airConditionPrice();
}
IFridge.java
package pattern.factory.absfactory.productsinterf;
import java.math.BigDecimal;
/**
* 〈一句話功能簡述〉抽象工廠方法:多個產品接口(抽象產品):冰箱接口<br>
* <p>
* 〈功能詳細描述〉
*
* @author 劉斌
* @date 2020/3/7
* @see [相關類/方法](可選)
* @since [產品/模塊版本] (可選)
*/
public interface IFridge {
/**
* 冰箱生產商
*
* @return 冰箱生產商
*/
String fridgeProducer();
/**
* 冰箱生產日期
*
* @return 冰箱生產日期
*/
String fridgeCreateDate();
/**
* 冰箱價格
*
* @return 冰箱價格
*/
BigDecimal fridgePrice();
}
IMicrowave.java
package pattern.factory.absfactory.productsinterf;
import java.math.BigDecimal;
/**
* 〈一句話功能簡述〉抽象工廠方法:多個產品接口(抽象產品):微波爐接口<br>
* <p>
* 〈功能詳細描述〉
*
* @author 劉斌
* @date 2019/12/2
* @see [相關類/方法](可選)
* @since [產品/模塊版本] (可選)
*/
public interface IMicrowave {
/**
* 微波爐生產商
*
* @return 微波爐生產商
*/
String microwaveProducer();
/**
* 微波爐生產日期
*
* @return 微波爐生產日期
*/
String microwaveCreateDate();
/**
* 微波爐價格
*
* @return 微波爐價格
*/
BigDecimal microwavePrice();
}
具體產品
MediaAirConditionerImpl.java
package pattern.factory.absfactory.productsimpl;
import constant.Constant;
import pattern.factory.absfactory.productsinterf.IAirConditioner;
import java.math.BigDecimal;
/**
* <一句話功能簡述>抽象工廠模式:多個產品實現:美的空調產品實現類<br/>
* <p>
* <功能詳細描述>
*
* @author 劉斌
* @date 2020/02/14
* @see [相關類/方法] (可選)
* @since [產品/模塊版本] (可選)
*/
public class MediaAirConditionerImpl implements IAirConditioner {
@Override
public String airConditionProducer() {
return "美的空調";
}
@Override
public String airConditionCreateDate() {
return "2020-03-07";
}
@Override
public BigDecimal airConditionPrice() {
return new BigDecimal(Constant.NUM_1000);
}
}
MediaFridgeImpl.java
package pattern.factory.absfactory.productsimpl;
import constant.Constant;
import pattern.factory.absfactory.productsinterf.IFridge;
import java.math.BigDecimal;
/**
* <一句話功能簡述>抽象工廠模式:多個產品實現:美的冰箱產品實現類<br/>
* <p>
* <功能詳細描述>
*
* @author 劉斌
* @date 2020/3/7
* @see [相關類/方法](可選)
* @since [產品/模塊版本] (可選)
*/
public class MediaFridgeImpl implements IFridge {
@Override
public String fridgeProducer() {
return "美的冰箱";
}
@Override
public String fridgeCreateDate() {
return "2020-03-07";
}
@Override
public BigDecimal fridgePrice() {
return new BigDecimal(Constant.NUM_2999);
}
}
MediaMicrowaveImpl.java
package pattern.factory.absfactory.productsimpl;
import constant.Constant;
import pattern.factory.absfactory.productsinterf.IMicrowave;
import java.math.BigDecimal;
/**
* <一句話功能簡述>抽象工廠模式:多個產品實現:美的微波爐產品實現類<br/>
* <p>
* <功能詳細描述>
*
* @author 劉斌
* @date 2020/3/7
* @see [相關類/方法](可選)
* @since [產品/模塊版本] (可選)
*/
public class MediaMicrowaveImpl implements IMicrowave {
@Override
public String microwaveProducer() {
return "美的微波爐";
}
@Override
public String microwaveCreateDate() {
return "2020-03-07";
}
@Override
public BigDecimal microwavePrice() {
return new BigDecimal(Constant.NUM_799);
}
}
抽象工廠
OriginFactory.java
package pattern.factory.absfactory.factory;
import pattern.factory.absfactory.productsinterf.IAirConditioner;
import pattern.factory.absfactory.productsinterf.IFridge;
import pattern.factory.absfactory.productsinterf.IMicrowave;
/**
* <一句話功能簡述>抽象工廠模式:抽象工廠<br/>
* <p>
* <功能詳細描述>提供了創建產品的接口,它包含多個創建產品的方法,可以創建多個不同等級的一些列產品
*
* @author 劉斌
* @date 2020/3/7
* @see [相關類/方法](可選)
* @since [產品/模塊版本] (可選)
*/
public interface OriginFactory {
/**
* 生產微波爐
*
* @return 微波爐
*/
IMicrowave createMicrowave();
/**
* 生產冰箱
*
* @return 冰箱
*/
IFridge createFridge();
/**
* 生產空調
*
* @return 空調
*/
IAirConditioner createAirConditioner();
}
具體工廠
MediaFactoryImpl.java
package pattern.factory.absfactory.factoryimpl;
import pattern.factory.absfactory.factory.OriginFactory;
import pattern.factory.absfactory.productsimpl.MediaAirConditionerImpl;
import pattern.factory.absfactory.productsimpl.MediaFridgeImpl;
import pattern.factory.absfactory.productsimpl.MediaMicrowaveImpl;
import pattern.factory.absfactory.productsinterf.IAirConditioner;
import pattern.factory.absfactory.productsinterf.IFridge;
import pattern.factory.absfactory.productsinterf.IMicrowave;
/**
* <一句話功能簡述>抽象工廠模式:具體工廠<br/>
* <p>
* <功能詳細描述>實現抽象工廠的方法,它可以可以創建多個不同等級的一些列產品
*
* @author 劉斌
* @date 2020/3/7
* @see [相關類/方法](可選)
* @since [產品/模塊版本] (可選)
*/
public class MediaFactoryImpl implements OriginFactory {
/**
* 生產微波爐
*
* @return 微波爐
*/
@Override
public IMicrowave createMicrowave() {
return new MediaMicrowaveImpl();
}
/**
* 生產冰箱
*
* @return 冰箱
*/
@Override
public IFridge createFridge() {
return new MediaFridgeImpl();
}
/**
* 生產空調
*
* @return 空調
*/
@Override
public IAirConditioner createAirConditioner() {
return new MediaAirConditionerImpl();
}
}
抽象工廠模式-客戶端調用
AbsFactoryDemo.java
package pattern.factory.absfactory;
import pattern.factory.absfactory.factoryimpl.MediaFactoryImpl;
/**
* <一句話功能簡述>抽象工廠模式:客戶端調用<br/>
* <p>
* <功能詳細描述>
*
* @author 劉斌
* @date 2020/3/7
* @see [相關類/方法](可選)
* @since [產品/模塊版本] (可選)
*/
public class AbsFactoryDemo {
public static void main(String[] args) {
MediaFactoryImpl mediaFactory = new MediaFactoryImpl();
System.out.println(mediaFactory.createAirConditioner().airConditionCreateDate());
System.out.println(mediaFactory.createAirConditioner().airConditionProducer());
System.out.println(mediaFactory.createAirConditioner().airConditionPrice());
System.out.println("============================================");
System.out.println(mediaFactory.createFridge().fridgeCreateDate());
System.out.println(mediaFactory.createFridge().fridgeProducer());
System.out.println(mediaFactory.createFridge().fridgePrice());
System.out.println("============================================");
System.out.println(mediaFactory.createMicrowave().microwaveCreateDate());
System.out.println(mediaFactory.createMicrowave().microwavePrice());
System.out.println(mediaFactory.createMicrowave().microwaveProducer());
}
}