携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
简介
抽象工厂模式相对于工厂方法模式相对复杂一些,当然实战应用到的机会也不太多。我理解抽象工厂相比较于工厂方法模式的不同主要体现在以下2点:
1、工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个
2、工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个
展开来说就是:
工厂方法模式:
- 一个抽象产品类,可以派生出多个具体产品类
- 一个抽象工厂类,可以派生出多个具体工厂类
- 每个具体工厂类只能创建一个具体产品类的实例
抽象工厂方法:
- 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
- 一个抽象工厂类,可以派生出多个具体工厂类
- 每个具体工厂类可以创建多个具体产品类的实例
除了这2点之外,我还没有理解到有其他的不同。
案例
下面我们通过例子来说明抽象工厂方法的使用。
如下图中的类关系图。在抽象工厂中我们有了多个产品,相对于工厂方法模式只有一个汽车产品,而抽象工厂方法模式中我们有云服务器产品、云数据库产品,对应的产品的厂家是阿里云和腾讯云,然后对应的厂家分别通过工厂去生产者2种产品。
public interface IDatabase {
void save();
void query();
}
public class AliDataBase implements IDatabase {
@Override
public void save() {
System.out.println("阿里数据库保存");
}
@Override
public void query() {
System.out.println("阿里数据库查询");
}
}
public class TencentDataBase implements IDatabase {
@Override
public void save() {
System.out.println("腾讯数据库保存");
}
@Override
public void query() {
System.out.println("腾讯数据库查询");
}
}
public interface IServer {
void upload();
void deploy();
}
public class AliServer implements IServer{
@Override
public void upload() {
System.out.println("阿里服务器上传");
}
@Override
public void deploy() {
System.out.println("阿里服务器部署");
}
}
public class TencentServer implements IServer{
@Override
public void upload() {
System.out.println("腾讯服务器上传");
}
@Override
public void deploy() {
System.out.println("腾讯服务器部署");
}
}
public interface ICompanyFactory {
IDatabase createDataBase();
IServer createServer();
}
public class AliFactory implements ICompanyFactory{
@Override
public IDatabase createDataBase() {
return new AliDataBase();
}
@Override
public IServer createServer() {
return new AliServer();
}
}
public class TencentFactory implements ICompanyFactory{
@Override
public IDatabase createDataBase() {
return new TencentDataBase();
}
@Override
public IServer createServer() {
return new TencentServer();
}
}
public class App {
public static void main(String[] args) {
AliFactory aliFactory = new AliFactory();
aliFactory.createDataBase().save();
aliFactory.createDataBase().query();
aliFactory.createServer().upload();
aliFactory.createServer().deploy();
TencentFactory tencentFactory = new TencentFactory();
tencentFactory.createDataBase().save();
tencentFactory.createDataBase().query();
tencentFactory.createServer().upload();
tencentFactory.createServer().deploy();
}
}
总结
1、抽象工厂方法在工厂方法模式的基础上又进行了拓展,适配了一个工厂可以生产多个产品的情况,但是类的数量肉眼可见地增加了,而且理解运用的难度增加了,较难维护。
2、抽象工厂方法更适用于横向拓展,即产品类型是固定的,去增加不同的厂家,如例子中如果我们需要阿里云腾讯云再去生产另一个产品,比如云储存,那我们要改动的类就涉及比较多,咱们的ICompanyFactory和两个实现Factory都要修改。但是如果要增加一个公司同样来生产云服务器和云数据库,那我们只需要拓展,即增加HuaweiDataBase、HuaweiServer及HuaweiFactory,这样不需任何修改,只是增加。即满足我们开闭原则,对拓展开放、对修改关闭。
3、工厂方法模式适用于是一个产品等级结构,而抽象工厂方法适用于多个产品等级结构的场景。