0
点赞
收藏
分享

微信扫一扫

Java与设计模式-抽象工厂模式


    首先说明,文章较长,保证你有耐心看完肯定能懂,没耐心直接点×即可。

    抽象工厂模式,是创建型设计模式之一。抽象型工厂模式适合产品确定,产品线不确定的类型,怎么讲?通过一个具体例子来讲一下吧。例如某电脑厂商要生产电脑,也就是电脑这个产品确定,而电脑配置不确定,这种情况可以用抽象工厂模式来解决。类图如图所示:

Java与设计模式-抽象工厂模式_ide


代码实现完全结合UML类图,结合图就可以完成系统创建。

本实例里是抽象类ComputerFactory(对应UML类图中的AbstractFactory):

package com.factory.demo;

public abstract class ComputerFactory {
public abstract CPU createCPU();
public abstract MainBoard createMainBoard();
public abstract RAM createRAM();

}

有三个方法,生产CPU,生产主板和生产内存。

产品抽象接口,CPU(对应UML类图中的ProductA):

package com.factory.demo;

public interface CPU {

void cpu();
}

产品抽象接口,主板(对应UML类图中的ProductB):

package com.factory.demo;

public interface MainBoard {
void mainboard();
}

产品抽象接口,内存((对应UML类图中的ProductC)):

package com.factory.demo;

public interface RAM {

void ram();
}


下面是具体产品,CPU的I3(对应UML类图中的ProductA1):

package com.factory.demo;

public class I3CPU implements CPU {

public void cpu() {
System.out.println("i3处理器");

}

}

具体产品,CPU的I5(对应UML类图中的ProductA2):


package com.factory.demo;

public class I5CPU implements CPU {

public void cpu() {
System.out.println("i5处理器");

}

}


具体产品,主板 联想主板(对应UML类图中的ProductB1):

package com.factory.demo;

public class LenovoMainBoard implements MainBoard {

@Override
public void mainboard() {
System.out.println("华硕主板");

}

}


具体产品,主板 华硕主板(对应UML类图中的ProductB2):

package com.factory.demo;

public class ASUSMainBoard implements MainBoard {

@Override
public void mainboard() {
System.out.println("联想主板");

}

}

具体产品 内存 三星内存(对应UML类图中的ProductC1):

package com.factory.demo;

public class SamsungRAM implements RAM {

public void ram() {
System.out.println("三星内存");

}

}

具体产品,内存 金士顿内存(对应UML类图中的ProductC2):

package com.factory.demo;

public class KingStoneRAM implements RAM {

public void ram() {
System.out.println("金士顿内存");

}

}


具体工厂类1,Computer1继承抽象工厂类(对应UML类图中的Factory1):

package com.factory.demo;

public class Computer1 extends ComputerFactory {
/**
* 组装电脑1,用的i3处理器、联想的主板和三星的内存
* @return
*/

@Override
public CPU createCPU() {
return new I3CPU();
}

@Override
public MainBoard createMainBoard() {
return new LenovoMainBoard();
}

@Override
public RAM createRAM() {
return new SamsungRAM();
}



}


具体工厂类2,Computer2继承抽象工厂类(对应UML类图中的Factory2):

package com.factory.demo;

public class Computer2 extends ComputerFactory {
/**
* 组装电脑2,用的i5处理器、华硕的主板和金士顿的内存
* @return
*/

@Override
public CPU createCPU() {
return new I5CPU();
}

@Override
public MainBoard createMainBoard() {
return new ASUSMainBoard();
}

@Override
public RAM createRAM() {
return new KingStoneRAM();
}


}

这时创建一个测试类:

package com.factory.demo;

public class TestFactory {

public static void main(String[] args) {
//电脑1
ComputerFactory computer1=new Computer1();
System.out.println("组装产品类型1:");
computer1.createCPU().cpu();
computer1.createMainBoard().mainboard();
computer1.createRAM().ram();

//电脑2
ComputerFactory computer2=new Computer2();
System.out.println("组装产品类型2:");
computer2.createCPU().cpu();
computer2.createMainBoard().mainboard();
computer2.createRAM().ram();



}

}


运行测试类:

Java与设计模式-抽象工厂模式_类图_02

总结一下:上面每一个类或接口都对应了UML类图中的每一个元素,可以参照UML类图构建系统。本系统好处是分离了接口和实现,实现产品下种类切换时十分灵活容易(也就是再制作一条产品Computer3的生产线很容易)。缺点也是显而易见,会造成类爆炸性增长可以参照下图:

Java与设计模式-抽象工厂模式_工厂类_03

还有一个缺点就是不容易增加其他产品类,增加一个产品类就需要修改抽象工厂,那么所有具体工厂类也必须被修改。

下面我们看一下如何增加一条Computer3的生产线:

Computer3的配置是i7 CPU+华硕主板+金士顿内存。这时我们首先要实现一个i7的CPU(对应UML类图中的ProductA3):

package com.factory.demo;

public class I7CPU implements CPU {

public void cpu() {
System.out.println("i7处理器");

}

}


然后是具体工厂类3,Computer3继承抽象工厂类(对应UML类图中的Factory3):

package com.factory.demo;

public class Computer3 extends ComputerFactory {
/**
* 组装电脑3,i7 CPU+华硕主板+金士顿内存
* @return
*/

@Override
public CPU createCPU() {
return new I7CPU();
}

@Override
public MainBoard createMainBoard() {
return new ASUSMainBoard();
}

@Override
public RAM createRAM() {
return new KingStoneRAM();
}


}


测试类增加Computer3的代码,增加后如下:

package com.factory.demo;

public class TestFactory {

public static void main(String[] args) {
//电脑1
ComputerFactory computer1=new Computer1();
System.out.println("组装产品类型1:");
computer1.createCPU().cpu();
computer1.createMainBoard().mainboard();
computer1.createRAM().ram();

//电脑2
ComputerFactory computer2=new Computer2();
System.out.println("组装产品类型2:");
computer2.createCPU().cpu();
computer2.createMainBoard().mainboard();
computer2.createRAM().ram();

//电脑3
ComputerFactory computer3=new Computer3();
System.out.println("组装产品类型3:");
computer3.createCPU().cpu();
computer3.createMainBoard().mainboard();
computer3.createRAM().ram();

}

}


运行实例如下:

Java与设计模式-抽象工厂模式_工厂类_04

可以看出来扩展生产线变得很容易,系统扩展性大大增强。





举报

相关推荐

0 条评论