目录
概念
抽象工厂模式是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂是创建型设计模式,它强调了一系列相关产品对象(属于同一个产品族)的创建过程,它和工厂方法模式的侧重点不同,工厂方法模式更加侧重于同一产品等级,而抽象工厂模式侧重的是同一产品族。简单说就是一个工厂中生产的一系列对象都是同一个产品族的。
改进方面
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
特点
使用抽象工厂模式一般要满足以下条件。
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());
}
}