之前我们对工厂方法模式已经有所了解了,那抽象工厂模式又是什么呢?
定义
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。
使用场景
如果一个或多个对象有相同的约束时,可以使用抽象工厂模式。那什么是有相同约束的对象呢?
举个栗子,同样是iPhone的处理器,但是可能是由三星或者台积电分别代工生产的,如果用代码模拟这个场景就可以考虑用抽象工厂模式。再比如不同型号的iPhone处理器有着不同的工艺制程,我们也可以用抽象工厂模式来模拟不同型号处理器的生产过程。
实现
抽象工厂模式一般由四大模块组成:
- 抽象产品类:每种产品要实现的统一接口
- 具体的产品类:要创建的具体产品
- 抽象工厂类:声明若干创建产品(对象)的方法
- 具体的工厂类:创建具体的产品
接下来我们用抽象工厂模式来模拟上述第一个例子。
首先创建一个抽象产品类:
public interface Processor {
void processor();
}
因为由三星和台积电共同代工,则具体的产品类应该有两个,代表是三星生产的还是台积电生产的:
public class SamsungProcessor implements Processor{
@Override
public void processor() {
Log.e("SamsungProcessor", "三星代工的处理器");
}
}
public class TSMCProcessor implements Processor{
@Override
public void processor() {
Log.e("TSMCProcessor", "台积电代工的处理器");
}
}
产品有了,就可以着手建厂了,创建一个抽象工厂类:
public abstract class ProcessorFactory {
public abstract Processor createProcessor();
}
接下来创建两个具体的工厂类:三星和台积电的工厂
public class SamsungProcessorFactory extends ProcessorFactory{
@Override
public Processor createProcessor() {
return new SamsungProcessor();
}
}
public class TSMCProcessorFactory extends ProcessorFactory {
@Override
public Processor createProcessor() {
return new TSMCProcessor();
}
}
到这里我们提到的四大模块就都有了,做个测试吧:
public class Client {
public static void test() {
//生产三星代工的处理器
SamsungProcessorFactory samsungProcessorFactory = new SamsungProcessorFactory();
samsungProcessorFactory.createProcessor().processor();
//生产台积电代工的处理器
TSMCProcessorFactory tsmcProcessorFactory = new TSMCProcessorFactory();
tsmcProcessorFactory.createProcessor().processor();
}
}
这是最终的log:
result
如果手机的屏幕、镜头模组、内存等部件也分别由不同的厂商供应,对应到代码中就需要增加相应的工厂类和产品类,这样就导致类文件数量激增,对项目而言并不是一件好事,所以在实际开发中还是要权衡利弊。
对比工厂方法模式,核心的四大模块都是一样的,但是构造的过程却是不同的,在工厂方法模式中,只有一个具体的工厂,而在抽象工厂模式中可能会有多个具体的工厂,因为相同或类似的产品我们可以找多个工厂帮我们生产。
网友评论