结合案例深⼊解析:抽象⼯⼚模式
⼀、基本概念
当涉及到产品族的时候,就需要引⼊抽象⼯⼚模式了。
每⼀个模式都是针对⼀定问题的解决⽅案。抽象⼯⼚模式与⼯⼚⽅法模式的最⼤区别就在于,⼯⼚⽅法模式针对的是⼀个产品等级结构;⽽抽象⼯⼚模式则需要⾯对多个产品等级结构。
在学习抽象⼯⼚具体实例之前,应该明⽩两个重要的概念:产品族和产品等级。
所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。⽐如AMD的主板、芯⽚组、CPU组成⼀个家族,Intel的主板、芯⽚组、CPU组成⼀个家族。⽽这两个家族都来⾃于三个产品等级:主板、芯⽚组、CPU。⼀个等级结构是由相同的结构的产品组成,⽰意图如下:
mongodb和mysql结合⼆、案例
⼀个经典的例⼦是造⼀台电脑。我们先不引⼊抽象⼯⼚模式,看看怎么实现。
因为电脑是由许多的构件组成的,我们将 CPU 和主板进⾏抽象,然后 CPU 由 CPUFactory ⽣产,主板由 MainBoardFactory ⽣产,然后,我们再将 CPU 和主板搭配起来组合在⼀起,如下:
代码组织结构:
这个时候的客户端调⽤是这样的(测试类):
public class MyTest {
public static void main(String[] args){
// 得到 Intel 的 CPU
CPUFactory intelCPUFactory = new IntelCPUFactory();
CPU cpu = intelCPUFactory.makeCPU();
// 得到 AMD 的主板
MainBoardFactory mainBoardFactory = new AmdMainBoardFactory();
MainBoard mainBoard = mainBoardFactory.makeMB();
// 组装 CPU 和主板
Computer computer = new Computer(cpu, mainBoard);
System.out.println(computer);
}
}
具体的完整代码可以看
单独看 CPU ⼯⼚和主板⼯⼚,它们分别是前⾯我们说的⼯⼚模式。
这种⽅式也容易扩展,因为要给电脑加硬盘的话,只需要加⼀个 HardDiskFactory 和相应的实现即可,不需要修改现有的⼯⼚。
但是,这种⽅式有⼀个问题,那就是如果 Intel 家产的 CPU 和 AMD 产的主板不能兼容使⽤,那么这代码就容易出错,因为客户端并不知道它们不兼容,也就会错误地出现随意组合。
下⾯就是我们要说的产品族的概念,它代表了组成某个产品的⼀系列附件的集合:
当涉及到这种产品族的问题的时候,就需要抽象⼯⼚模式来⽀持了。我们不再定义 CPU ⼯⼚、主板⼯
⼚、硬盘⼯⼚、显⽰屏⼯⼚等等,我们直接定义电脑⼯⼚,每个电脑⼯⼚负责⽣产所有的设备,这样能保证肯定不存在兼容问题。
这个时候,对于客户端来说,不再需要单独挑选 CPU⼚商、主板⼚商、硬盘⼚商等,直接选择⼀家品牌⼯⼚,品牌⼯⼚会负责⽣产所有的东西,⽽且能保证肯定是兼容可⽤的。
改装的抽象⼯⼚模式代码组织结构如下:
主要的代码:
三个⼯⼚:(⼀个超类⼯⼚PCFactory,两个⼤⼚⼯⼚AmdFactory、InterFactory)
public interface PCFactory {
CPU makeCPU();
MainBoard makeMB();
// HardDisk makeHD();
}
public class AmdFactory implements PCFactory{
@Override
public CPU makeCPU() {
return new AmdCPU();
}
@Override
public MainBoard makeMB() {
return new AmdMainBoard();
}
}
public class IntelFactory implements PCFactory {
@Override
public CPU makeCPU() {
return new IntelCPU();
}
@Override
public MainBoard makeMB() {
return new IntelMainBoard();
}
}
最后的测试类:
public class MyTest {
public static void main(String[] args){
// 第⼀步就要选定⼀个“⼤⼚”
PCFactory cf = new AmdFactory();
// 从这个⼤⼚造 CPU
CPU cpu = cf.makeCPU();
// 从这个⼤⼚造主板
MainBoard board = cf.makeMB();
//... 从这个⼤⼚造硬盘。等等
// 将同⼀个⼚⼦出来的 CPU、主板、硬盘组装在⼀起
Computer computer = new Computer(cpu, board);
}
}
三、总结
当然,抽象⼯⼚的问题也是显⽽易见的,⽐如我们要加个显⽰器,就需要修改所有的⼯⼚,给所有的⼯⼚都加上制造显⽰器的⽅法。这有点违反了对修改关闭,对扩展开放这个设计原则。
免费Java⾼级资料需要⾃⼰领取,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo⾼并发分布式等教程,⼀共30G。
传送门:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。