一、概念
简单工厂模式和工厂模式,不管工厂怎么拆分抽象,都只是针对一类产品Phone(AbstractProduct),如果要生成另一种产品PC,比如小米电脑,苹果电脑应该怎么表示呢?
最简单的方式是把工厂方法模式完全复制一份,不过这次生产的是PC。但同时也就意味着我们要完全复制和修改Phone生产管理的所有代码,显然这是一个笨办法,并不利于扩展和维护。
抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。
抓住重点,系列产品同一工厂实现
二、UML图
从上面类图结构中可以清楚的看到如何在工厂方法模式中通过增加新产品接口来实现产品的增加的。
接下来我们继续通过小米和苹果产品生产的例子来解释该模式。
为了弄清楚上面的结构,我们使用具体的产品和工厂来表示上面的UML类图,能更加清晰的看出模式是如何演变的:
三、代码实例
phone抽象类
public abstract class AbstractPhone {
abstract void name();
}
xiaomi phone实现
public class XiaoMiPhone extends AbstractPhone {
@Override
public void name() {
System.out.println("xiaomi phone");
}
}
apple phone实现
public class ApplePhone extends AbstractPhone {
@Override
public void name() {
System.out.println("apple phone");
}
}
pc抽象类
public abstract class AbstractComputer {
abstract void name();
}
xiaomi pc实现
public class XiaoMiComputer extends AbstractComputer {
@Override
void name() {
System.out.println("xiao mi pc");
}
}
apple pc实现
public class AppleComputer extends AbstractComputer {
@Override
void name() {
System.out.println("apple pc");
}
}
工厂抽象类,定义工厂能干什么
public abstract class AbstractFactory {
abstract AbstractPhone makePhone();
abstract AbstractComputer makeComputer();
}
xiaomi工厂
public class XiaoMiFactory extends AbstractFactory {
@Override
public AbstractPersonalComputer makeComputer() {
return new XiaoMiComputer();
}
@Override
public AbstractPhone makePhone() {
return new XiaoMiPhone();
}
}
apple工厂
public class AppleFactory extends AbstractFactory {
@Override
AbstractPersonalComputer makeComputer() {
return new AppleComputer();
}
@Override
AbstractPhone makePhone() {
return new ApplePhone();
}
}
演示
public class AbstractFactoryPatternTest {
public static void main(String[] args) {
//创建工厂,工厂创建对象
new XiaoMiFactory().makePhone().name();
new XiaoMiFactory().makeComputer().name();
new AppleFactory().makePhone().name();
new AppleFactory().makeComputer().name();
}
}