一天一个设计模式:抽象方法模式
为什么引入抽象工厂模式?
或者说抽象工厂模式与工厂方法模式的区别?
工厂方法模式针对的是一类产品的等级结构,而抽象工厂模式针对的是多个产品等级结构(一个产品族)。
引入概念:产品族与产品等级
产品族:指在不同的产品等级结构中,功能相关联的产品组成的家族。
产品等级:同类产品的不同产品区分。
抽象工厂的作用:
就是创建不同产品等级,但属于同一产品族的产品
那抽象工厂的定义:
创建不同产品等级,但属于同一产品族的产品的工厂的抽象。
那么具体的实现工厂就对应了不同的产品等级下的同一产品族的所有产品。
抽象工厂模式结构:
抽象工厂定义了一个产品族的生产功能,然后交由具体的产品工厂去生产。
注:抽象工厂的接口不是随意堆砌的,而是相互关联或依赖的方法集成在一起的。
例子如下图:以电脑为例
优点:
分离接口与实现
使用抽象工厂来创建所需要的对象,客户端仅仅是面向接口来编程,客户端可以实现从产品中解耦。
使切换产品族变得更容易
因为一个具体的工厂实现代表一个产品族,仅替换实现工厂即可切换。
缺点:
不易扩展
产品族如果有新产品出现,就需要对抽象工厂进行修改,这会导致需要更新所有的工厂类。
实例:
抽象工厂:
public interface AbstractFactory { /** * 创建CPU对象 * @return CPU对象 */ public Cpu createCpu(); /** * 创建主板对象 * @return 主板对象 */ public Mainboard createMainboard(); }
英特尔工厂:
public class IntelFactory implements AbstractFactory { @Override public Cpu createCpu() { // TODO Auto-generated method stub return new IntelCpu(755); } @Override public Mainboard createMainboard() { // TODO Auto-generated method stub return new IntelMainboard(755); } }
amd工厂:
public class AmdFactory implements AbstractFactory { @Override public Cpu createCpu() { // TODO Auto-generated method stub return new IntelCpu(938); } @Override public Mainboard createMainboard() { // TODO Auto-generated method stub return new IntelMainboard(938); } }
装机人员:
public class ComputerEngineer { /** * 定义组装机需要的CPU */ private Cpu cpu = null; /** * 定义组装机需要的主板 */ private Mainboard mainboard = null; public void makeComputer(AbstractFactory af){ /** * 组装机器的基本步骤 */ //1:首先准备好装机所需要的配件 prepareHardwares(af); //2:组装机器 //3:测试机器 //4:交付客户 } private void prepareHardwares(AbstractFactory af){ //这里要去准备CPU和主板的具体实现,为了示例简单,这里只准备这两个 //可是,装机工程师并不知道如何去创建,怎么办呢? //直接找相应的工厂获取 this.cpu = af.createCpu(); this.mainboard = af.createMainboard(); //测试配件是否好用 this.cpu.calculate(); this.mainboard.installCPU(); } }
测试代码:
public class Client { public static void main(String[]args){ //创建装机工程师对象 ComputerEngineer cf = new ComputerEngineer(); //客户选择并创建需要使用的产品对象 AbstractFactory af = new IntelFactory(); //告诉装机工程师自己选择的产品,让装机工程师组装电脑 cf.makeComputer(af); } }
最后补充一句:
看到i7-9900k的售价,英特尔真是骗傻子钱多有恃无恐。干他妈的英特尔,amd加油!!!
参考链接:
https://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html