注意: 抽象工厂模式 和 工厂方法模式不要混肴了,抽象工厂模式扩展性更强,工厂方法模式更具体一些。抽象工厂是工厂方法的升级版本。他们的却别在于工厂方法用的是一个接口的所有东西,而抽象工厂用的是多个接口的不同东西。
什么是抽象工厂模式?
为指定的对象提供接口,而不指定他们的具体类。
抽象工厂模式,意在抽象这个词上边,抽象工厂说明这个工厂出来的东西是不具体的。
举个例子:抽象工厂模式源于以前针对不同操作系统的图形化解决方案,如Android和os中控件TextView、Button等控件,虽然都有这个对象,但是实现语言不同,展示效果也不尽然。所以对于不同的操作系统构成一个System产品类,而其下共同都有的TextView、Button等控件又是一个产品类。一家公司要来生产跨平台的App的时候,是一对一从原型设计到产品出炉都实行一套方案呢?还是使用抽象来衍生各个系统的需求实现呢?答案当然是后者,如果操作系统不止这两种还有Windows Phone、blackberry等,如果都要一对一来实现,那岂不是要浪费很多人力物力?这也是刚开始学的依赖倒置原则的实现。
抽象工厂模式中的四类角色
- 抽象工厂角色(AbstractFactory)
- 具体工厂角色(ConcreteFactory)
- 抽象产品角色(AbstractProduct)
- 具体产品角色(ConcreteProduct)
抽象工厂方法模式的实现
汽车厂生产汽车,一种汽车配有轮胎和引擎的配件。
抽象总车厂类:ICarFactory
public interface ICarFactory{
ITire createTire();//轮胎
IEngine createEngine();//引擎
}
轮胎相关类:ITire
public interface ITire{
void tire();
}
public class NormalTire implements ITire{
public void tire(){
system.out.println("我是普通轮胎");
}
}
public class SUVTire implements ITire{
public void tire(){
system.out.println("我是越野轮胎");
}
}
发动机相关类:IEngine
public interface IEngine{
void engine();
}
public class NormalEngine imlements IEngine{
public void engine(){
system.out.println("我是国产引擎");
}
}
public class SUVEngine implements IEngine{
public void engine(){
system.out.println("我是进口引擎");
}
}
东风汽车生产:
public class DongFengFactory implements ICarFactory{
public ITire createTire(){
return new NormalTire();
}
public IEngine createEngine(){
return new NormalEngine();
}
}
进口汽车生产:
public class ImprotFactory implements ICarFactory{
public ITire createTire(){
return new SUVTire();
}
public IEngine createEngine(){
return new SUVEngine();
}
}
主类调用:
public static void main(String[] args){
ICarFactory car = new ImportFactory();
car.caeateTire().tire();
car.createEngine().engine();
system.out.println("----------------")
ICarFactory mCar = new NormalFactory();
mCar.caeateTire().tire();
mCar.createEngine().engine();
}
//运行结果
我是越野轮胎
我是进口引擎
----------------
我是普通轮胎
我是国产引擎
抽象工厂模式的优点在于便于更改产品簇。产品簇就是同一类产品,比如上方的轮胎相关类。还有分离了接口和实现类,客户端无需知道需要实现的具体对象。生产汽车不需要知道轮胎和引擎的种类。切换产品时更加灵活。
但是如果我们需要增加新一类的车吉普车,那么就要增加对应轮胎和引擎类,如果车种类过多,岂不是要增加很多的类文件,引起总体文件非常多,另外要增加新产品就要修改抽象工厂,那么具体工厂也要做相应的修改,实际开发要衡量好这个问题。
结合例子说一下工厂方法和抽象工厂方法的区别吧:
抽象工厂方法管理的比较细,他对分工做了明确规划:比如汽车轮胎和引擎的分别对待,你要加新产品可以在我相应的配件列表里增加配件并规划产品类,而工厂方法则不管这些,我就管生产一种汽车,你要想再增加新产品了,你重新写接口,重新配置产品类,而且你要想换轮胎等配件了还真是件麻烦事。你设计的代码好比这个汽车厂造汽车,如果功能少也就是只管造东风汽车(轮胎、引擎等配件固定,一对一关系),就用工厂方法模式,如果你设计的类功能复杂,也就是汽车比较高级(轮胎,引擎等配件种类多,一对多关系),就用抽象工厂模式。