建议先了解Java设计模式之【工厂模式】
一、抽象工厂模式(Abstract Factory Pattern)介绍
抽象工厂模式相当于将工厂模式增加了一个总公司,所有工厂归总公司管理。
使用场景:代工公司旗下有制造手机的工厂,有制造电脑的工厂;制造手机的工厂可生产多个品牌的手机,制造电脑的工厂可以生产多个品牌的电脑。客户来不论是订购哪个品牌的手机还是订购哪个品牌的电脑,只需和代工公司下订单即可,不需要关心公司下面的工厂。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
二、代码实现
1. 为手机工厂创建接口
public interface PhoneShape {
void create();
}
2. 创建PhoneShape接口的实现类
public class Huawei implements PhoneShape {
@Override public void create() {
System.out.println("生产一批华为手机!");
}
}
public class Mi implements PhoneShape{
@Override public void create() {
System.out.println("生产一批小米手机!");
}
}
public class Apple implements PhoneShape{
@Override public void create() {
System.out.println("生产一批苹果手机!");
}
}
3. 为电脑工厂创建接口
public interface PCShape {
void make();
}
4. 创建PCShape接口的实现类
public class Lenovo implements PCShape{
@Override public void make() {
System.out.println("生产一批联想电脑!");
}
}
public class Asus implements PCShape {
@Override public void make() {
System.out.println("生产一批华硕电脑!");
}
}
public class Dell implements PCShape {
@Override public void make() {
System.out.println("生产一批戴尔电脑!");
}
}
5. 为 PhoneShape 和 PCShape 对象创建抽象类来获取工厂。
public abstract class AbstractFactory {
public abstract PhoneShape getPhoneShape(String brand);
public abstract PCShape getPCShape(String brand);
}
6. 创建扩展了 AbstractFactory 的工厂类,用于选择需要创建的对象
public class PhoneShapeFactory extends AbstractFactory{
@Override public PhoneShape getPhoneShape(String brand) {
if(brand==null){
return null;
}
//判断手机品牌
switch (brand){
case "Mi":
return new Mi();
case "Huawei":
return new Huawei();
case "Apple":
return new Apple();
default:
return null;
}
}
@Override public PCShape getPCShape(String brand) {
return null;
}
}
public class PCShapeFactory extends AbstractFactory{
@Override public PhoneShape getPhoneShape(String brand) {
return null;
}
@Override public PCShape getPCShape(String brand) {
if(brand==null){
return null;
}
//判断手机品牌
switch (brand){
case "Lenovo":
return new Lenovo();
case "Dell":
return new Dell();
case "Asus":
return new Asus();
default:
return null;
}
}
}
7. 创建一个工厂创造器/生成器类,通过传递手机品牌或电脑品牌来获取工厂。
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("Phone")){
return new PhoneShapeFactory();
} else if(choice.equalsIgnoreCase("PC")){
return new PCShapeFactory();
}
return null;
}
}
8. 使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
//获取手机工厂
AbstractFactory phoneShapeFactory = FactoryProducer.getFactory("Phone");
//小米制造手机
PhoneShape miPhoneShape = phoneShapeFactory.getPhoneShape("Mi");
miPhoneShape.create();
//获取电脑工厂
AbstractFactory PCShapeFactory = FactoryProducer.getFactory("PC");
//联想制造电脑
PCShape lenovoPCShape = PCShapeFactory.getPCShape("Lenovo");
lenovoPCShape.make();
}
}
结构未进行细分
运行结果: