对于抽象工厂模式实际上也是对简单工厂模式的一个加强,可以说也是对工厂方法模式的加强,对产品进行了进一步的抽象,类别划分得更加严密,等级更加的明确,还是以电视的例子为例,电视下面有长虹和创维,在简单工厂中只有一个大工厂,他可以生产出创维也可以生产长虹,而在工厂方法中对工厂进行了详细的分类将大工厂抽象出一个接口,分别创建具体实现的两个工厂,创维工厂跟长虹工厂,而在抽象工厂中会进行更进一步的抽象,我们会将品牌进行更详细的分类,电视下面有长虹和创维两个品牌,长虹电视可以有液晶电视和普通电视,创维同理,那么这样的话大工厂也将改变,以前是简单工厂和工厂方法都是直接获取产品,现在将改成获取液晶产品和一般产品,具体例子如下:
电视接口:
public interface TV {
public String getName();
}
分别有创维和长虹两个品牌:
public abstract class ChuangWeiTV implements TV{
@Override
public abstract String getName();
}
public abstract class ChangHongTV implements TV{
@Override
public abstract String getName();
}
创维和长虹又分别有液晶产品和一般产品
public class ChangHongPuTongTV extends ChangHongTV{
@Override
public String getName() {
return "长虹普通电视";
}
}
public class ChangHongYeJingTV extends ChangHongTV{
@Override
public String getName() {
return "长虹液晶电视";
}
}
public class ChuangWeiPuTongTV extends ChuangWeiTV{
@Override
public String getName() {
return "创维普通电视";
}
}
public class ChuangWeiYeJingTV extends ChuangWeiTV{
@Override
public String getName() {
return "创维液晶电视";
}
}
然后创建工厂
public interface TVFactory {
public TV getPuTongTV();
public TV getYeJingTV();
}
public class ChangHongTVFactory implements TVFactory{
@Override
public TV getPuTongTV() {
return new ChangHongPuTongTV();
}
@Override
public TV getYeJingTV() {
return new ChangHongYeJingTV();
}
}
public class ChuangWeiTVFactory implements TVFactory{
@Override
public TV getPuTongTV() {
return new ChuangWeiPuTongTV();
}
@Override
public TV getYeJingTV() {
return new ChuangWeiYeJingTV();
}
}
测试:
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
TVFactory tvFactory = new ChangHongTVFactory();
System.out.println(tvFactory.getPuTongTV().getName());
System.out.println(tvFactory.getYeJingTV().getName());
TVFactory tv1Factory = new ChuangWeiTVFactory();
System.out.println(tv1Factory.getPuTongTV().getName());
System.out.println(tv1Factory.getYeJingTV().getName());
}
}
如果再增加一个品牌的话也可以做到不修改源代码,但是加入再出了什么新的类型的产品,比如什么长虹金刚电视,这样就得修改工厂接口了,所以这里的电视这样用并不是很合理,重在理解思想,这里只是一个例子,如果是水果的话分北方的水果和南方水果还有什么西北方什么的,这个总不会新出现一个地区就适用,达到实现OCP原则,总之工厂模式系列的三种大家可以权衡取舍,没有完美的模式只有合适的模式