抽象工厂模式
1.定义:
为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定它们的具体类。
2.使用场景:
一个对象族有相同的约束时可以使用抽象工厂模式。咋一听,好像很抽象,举个例子帮助理解。例如,生产笔记本电脑,有很多品牌,如Hp,Dell,Lenovo等。如果仅仅生产这些品牌电脑,可以使用简单工厂模式。但是随着需求的扩展,有可能需要生产Mac,Sumsun等,此时简单工厂就需要修改大量的代码来适应,但是使用抽象工厂模式,只需要添加具体的产品类即可实现。
3.UML图
4.详解:
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
下面用代码举例阐述,首先是产品类接口与一些具体的实现类:
public interface Computer {
void create();
}
public static class HpComputer implements Computer {
@Override
public void create() {
System.out.println("create a Hp computer");
}
}
public static class LenovoComputer implements Computer {
@Override
public void create() {
System.out.println("create a Lenovo computer");
}
}
接着是工厂类接口与一些具体的实现类:
public interface IFactory {
Computer prouceComputer();
}
public static class HpFactory implements IFactory {
@Override
public Computer prouceComputer() {
return new HpComputer();
}
}
public static class LenovoFactory implements IFactory {
@Override
public Computer prouceComputer() {
return new LenovoComputer();
}
}
测试代码:
public static void main(String[] args) {
HpFactory hpFactory = new HpFactory();
hpFactory.prouceComputer().create();//输出结果:create a Hp computer
LenovoFactory lenovoFactory = new LenovoFactory();
lenovoFactory.prouceComputer().create();//输出结果:create a Lenovo computer
}
此外,抽象工厂方法还有一种写法,而且推荐使用这种方法。在不修改上面产品接口的情况下,重写工厂类接口,如下:
public interface ComputerFactory {
<T extends Computer> T produceComputer(Class<T> clz);
}
然后就是关键的工厂实现类了,代码如下:
public static class ConcreteComputerFactory implements ComputerFactory {
@Override
public <T extends Computer> T produceComputer(Class<T> clz) {
try {
Computer computer = (Computer) Class.forName(clz.getName()).newInstance();
return (T) computer;
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
return null;
}
}
}
这里用到了java的反射,相信了解java的小伙伴应该懂的,如果不懂,请自行百度。另外,如果需要生产Mac,只需要写Mac类实现Computer,然后调用这个工厂实现类,传入Mac.class即可完成生产Mac。
测试代码:
public static void main(String[] args) {
ComputerFactory computerFactory = new ConcreteComputerFactory();
HpComputer hpComputer = computerFactory.produceComputer(HpComputer.class);
hpComputer.create();//输出结果:create a Hp computer
LenovoComputer lenovoComputer = computerFactory.produceComputer(LenovoComputer.class);
lenovoComputer.create();//输出结果:create a Lenovo computer
}