定义:为创建一组相关或者相互依赖的对象提供一个接口,而无需指定它们的具体类。
抽象工厂的定义很抽象,下面我们贴出抽象工厂的UML图
在抽象工厂中有如下角色
AbstractFactory:抽象工厂,用来创建不同的产品
ConcreatFactory:具体工厂,实现抽象工厂创建产品的方法
AbstractProduct:抽象产品,用于声明每个产品的抽象方法
ConcreatProduct :具体产品,实现抽象产品的方法,生成具体的产品
下面我们还是举之前电脑的例子来用代码实现抽象工厂模式,假设现在的产品不仅仅有电话,还有pad ,相应的工厂中不仅仅生成电话,还生产平板,相应的,平板也具备打电话的功能。
定义产品接口 pad和phone
public interface Pad {
void call();
}
public interface Phone {
void call();
}
定义工厂接口
public interface IFactory {
Phone creatPhone();
Pad creatPad();
}
定义华为的pad和phone实现类
public class Huaweipad implements Pad {
@Override
public void call() {
Log.i("tag:","小米平板打电话");
}
}
public class HuaWeiPhone implements Phone {
@Override
public void call() {
Log.i("tag","小米手机打电话");
}
}
定于小米的pad 和phone实现类
public class XiaoMipad implements Pad {
@Override
public void call() {
Log.i("tag:","华为平板打电话");
}
}
public class XiaoMiPhone implements Phone {
@Override
public void call() {
Log.i("tag","华为手机打电话");
}
}
然后实现工厂接口,生成各自的产品
public class HuaweiFactory implements IFactory {
@Override
public Phone creatPhone() {
return new HuaWeiPhone();
}
@Override
public Pad creatPad() {
return new Huaweipad();
}
}
public class XiaoMiFactory implements IFactory {
@Override
public Phone creatPhone() {
return new XiaoMiPhone();
}
@Override
public Pad creatPad() {
return new XiaoMipad();
}
}
最后测试类
可以看出,客户端只是创建的工厂类不同,产生了不一样的结果,对比工厂相关的3种模式:public class Test { public static void main(String[] args) { IFactory factory=new HuaweiFactory(); factory.creatPhone().call(); factory.creatPad().call(); factory=new XiaoMiFactory(); factory.creatPhone().call(); factory.creatPad().call(); } }
1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。
2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。