什么是工厂模式?
一个功能,可能有不同的实现方法,因此我们把它抽象为一个接口,根据具体需求,编写许多个实现类。然后设计一个工厂,根据不同的条件,选择创建并返回我们具体需要的实现类对象。
为什么要用工厂模式?
工厂模式降低了对象构造之间的代码耦合,当我们更新接口的实现时,就不需要修改原来的代码,只需要修改工厂类的代码。
举个例子:
造一辆车,需要3个零件。我们自己造的话,那就要先 new 三个零件对象,然后作为构造函数的参数去 new 车的对象。假如说我们在很多地方造了车,当车的制造变为5个零件时,我们就必须修改所有造车的代码。如果我们使用工厂来帮我们造车,我们只需要修改工厂里造车方法的代码,就可以达到更新的目的,而不需要修改每一处造车的代码。
简单工厂模式、工厂方法模式、工厂抽象模式
简单工厂模式
简单工厂模式中,工厂是根据静态的参数(不是说参数是static的,而是工厂方法有固定的参数类型、参数列表)来选择创建哪一个实现类,工厂方法就是通过多个 if-else 或者 switch 来选择。
// 1、抽象产品角色
Interface ICar{
void show();
}
// 2、具体产品角色
class Benz() implements ICar{
public void show(){
System.out.println("这是一辆奔驰");
}
}
class BMW() implements ICar{
public void show(){
System.out.println("这是一辆宝马");
}
}
// 3、工厂角色
class CarFactory{
public create(String type){
if(type.equals("奔驰")){
return new Benz();
}else if(type.equals("宝马"){
return new BMW();
}else if(....){}
}
}
当选择条件很多时,只能通过添加 if-else 或者 switch-case 来扩充生产方法,不利于代码的维护,因此只有条件不多的情况下,才采用这种设计模式。
工厂方法模式
工厂方法模式不再使用单一工厂类负责所有产品的创建,而是将工厂抽象为一个统一的接口,定义统一的生产方法,具体的产品创建交给工厂的实现类去完成。当有新的产品引进时,我们不需要修改已有的工厂类,只需要为新产品创建一个新的工厂实现类就可以了。
// 1、抽象产品角色
Interface ICar{
void show();
}
// 2、具体产品角色
class Benz() implements ICar{
public void show(){
System.out.println("这是一辆奔驰");
}
}
class BMW() implements ICar{
public void show(){
System.out.println("这是一辆宝马");
}
}
...
// 3、抽象工厂角色
interface IFactory{
ICar create(){}
}
// 4、具体工厂角色
class BenzFactory implements IFactory{
public ICar create(){
return new Benz();
}
}
class BMWFactory implements IFactory{
public ICar create(){
return new BMW();
}
}
...
工厂方法模式中,对产品的创建细节进行了封装,一个具体的工厂只对应一个具体的产品,不需要修改现有系统即可实现新产品的扩充,具有良好的灵活性和可扩展性。它的缺点在于,增加新产品的同时也需要增加新工厂,导致类的个数成对增长,一定程度上增加了系统的复杂度。
抽象工厂模式
抽象工厂模式的改进点在于一个工厂不止负责一个产品对象,而是生产多个产品对象。
抽象工厂模式引入了两个概念:
1. 产品等级结构:产品等级结构就是产品的继承结构,比如一个抽象类是汽车,那么奔驰啊、宝马啊、保时捷啊之类具体的的牌子就是子类,抽象类汽车和具体牌子之间就构成了一个产品等级结构。
2. 产品族:产品族是指由同一工厂生产的,不同产品等级结构的一组产品,比如奔驰工厂生产的GLC、SLC车型,GLC就属于SUV产品等级结构,SLC就属于跑车等级结构。
工厂方法模式一个具体工厂仅仅负责一个具体车型的生产,而抽象工厂模式则将有关联的一个产品族聚合在同一个工厂中,一个奔驰工厂可以生产奔驰牌的跑车、SUV、小轿车。
参考:
http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html