上一篇我们实现了工厂模式,点击前往,但是有一个很大的缺陷就是一个工厂只能生产一个产品,那就意味着我们新添一个产品就要新添一个工厂,很明显这个任务量就太大了
为了避免这种情况,我们又引入了新的模式就是抽象工厂模式。
简单的说,抽象工厂模式就是在工厂模式的基础上,让一个工厂可以生产多个产品,而这些产品同时应该是属于同一个工厂的。
首先我们创建两个产品Car和Bike,并为他们分别提供一个实现方法:
package day01;
interface Car{
//提供生产方法
public void method();
}
package day01;
interface Bike{
public void method();
}
然后我们分别为两个产品接口实现两个产品实现:
package day01;
public class BenChiCar implements Car{
@Override
public void method() {
System.out.println("我是奔驰车");
}
}
package day01;
public class BaoMaCar implements Car{
@Override
public void method() {
System.out.println("我是宝马车");
}
}
package day01;
public class DoubleBike implements Bike{
@Override
public void method() {
System.out.println("我是双轮自行车");
}
}
package day01;
public class ThridBike implements Bike{
@Override
public void method() {
System.out.println("我是三轮自行车");
}
}
然后我们创建一个工厂接口,里面定义了两种方法用来获取不同的对象:
package day01;
interface AbstractFactory {
public Car createCar();
public Bike createBike();
}
然后创建一个具体工厂,用来实现工厂接口:
package day01;
public class Factory implements AbstractFactory{
@Override
public Car createCar() {
//返回具体某个实例
return new BenChiCar();
}
@Override
public Bike createBike() {
//返回具体的某个实例
return new ThridBike();
}
}
最后我们在客户端测试一下:
package day01;
public class Client {
public static void main(String[] args) {
AbstractFactory factory;
Car car;
Bike bike;
//获取总工厂
factory=new Factory();
//通过工厂获取car/Bike实例
car=factory.createCar();
bike=factory.createBike();
//通过实例调用具体实现
car.method();
bike.method();
}
}
到了这一步,抽象工厂模式就已经完成了。
我们发现,抽象工厂的操作对象,如果是一个新的产品族,比如本例中新添一个Train,只需要新添具体实现和新的具体工厂即可。但如果对象是一个新的产品等级,比如本例新添一个DaZongCar(属于car),就意味着需要大量的更改源码,显然这不符合开闭原则!