abstract-factory-design-pattern
抽象工厂模式的概念、抽象工厂的结构、抽象工厂的优缺点、抽象工厂的使用场景、抽象工厂的实现示例、抽象工厂的源码分析
1、抽象工厂的概念
抽象工厂模式,即工厂方法模式的升级版,其可以生产一个产品族的产品。
工厂方法模式的局限性是只能生产一类产品,这里我们把同类产品呢叫做同等级产品,如手机是一个等级,电脑是一个等级。一个新的定义,就是同族产品,如华为手机、华为电脑是同一族,同属华为族;苹果手机、苹果电脑是同一族,同属苹果族。于是,产品工厂的定义也由同等级工厂升级为同族产品工厂,如华为工厂、苹果工厂。不言而喻,不管是华为工厂还是苹果工厂,都具有生产手机和电脑的功能,故,抽象工厂的的作用就被定义了,那就是定义生产手机和电脑。
2、抽象工厂的结构
- 抽象产品:定义同等级产品的行为,即抽象工厂模式中有多个抽象产品类。
- 具体产品:实现抽象产品,使产品具像化。
- 抽象工厂:定义多个同等级产品的生产行为,即每次可生产出同族的不同等级的产品。
- 具体工厂:实现抽象工厂,来创建一个具体产品的对象实例。
3、抽象工厂的优缺点
- 优点:
- 可在类内部对产品族中相关联的多等级产品共同管理,而不必增加新的类管理。
- 增加一个新产品族时,无需修改原有代码,只需增加该产品族的具体产品及其对应的产品工厂即可。满足开闭原则。
- 缺点:
- 当增加一个新等级的产品时,几乎所有的工厂类都需要改动,所以产品等级的划分非常重要。
4、抽象工厂的使用场景
- 系统中有多个产品族,每个具体工厂创建属于同族单不同等级的产品。
- 系统每次只能使用同一族产品,即同族不同等级的产品。
5、抽象工厂的实现示例
抽象产品一:
public interface ComputeProduct {
/**
* 行为
*/
void behavior();
}
抽象产品一的具体产品一:
public class HuaComputeProduct implements ComputeProduct {
@Override
public void behavior() {
System.out.println("我是华为电脑");
}
}
抽象产品一的具体产品二:
public class AppleComputeProduct implements ComputeProduct {
@Override
public void behavior() {
System.out.println("我是苹果电脑");
}
}
抽象产品二:
public interface PhoneProduct {
/**
* 行为
*/
void behavior();
}
抽象产品二的具体产品一:
public class HuaPhoneProduct implements PhoneProduct {
@Override
public void behavior() {
System.out.println("我是华为手机");
}
}
抽象产品二的具体产品二:
public class ApplePhoneProduct implements PhoneProduct {
@Override
public void behavior() {
System.out.println("我是苹果手机");
}
}
抽象工厂:
public interface Factory {
/**
* 生产电脑
* @return
*/
ComputeProduct productCompute();
/**
* 生产手机
* @return
*/
PhoneProduct productPhone();
}
具体工厂一:
public class HuaFactory implements Factory {
@Override
public ComputeProduct productCompute() {
return new HuaComputeProduct();
}
@Override
public PhoneProduct productPhone() {
return new HuaPhoneProduct();
}
}
具体工厂二:
public class AppleFactory implements Factory {
@Override
public ComputeProduct productCompute() {
return new AppleComputeProduct();
}
@Override
public PhoneProduct productPhone() {
return new ApplePhoneProduct();
}
}
测试:
public class AbstractFactoryTest {
public static void main(String[] args) {
Factory huaFactory = new HuaFactory();
Factory appleFactory = new AppleFactory();
ComputeProduct huaComputeProduct = huaFactory.productCompute();
PhoneProduct huaPhoneProduct = huaFactory.productPhone();
ComputeProduct appleComputeProduct = appleFactory.productCompute();
PhoneProduct applePhoneProduct = appleFactory.productPhone();
huaComputeProduct.behavior();
huaPhoneProduct.behavior();
appleComputeProduct.behavior();
applePhoneProduct.behavior();
}
}
测试结果:
我是华为电脑
我是华为手机
我是苹果电脑
我是苹果手机
6、抽象工厂的源码分析
loading…