设计模式之抽象工厂模式

124 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

简介

抽象工厂模式相对于工厂方法模式相对复杂一些,当然实战应用到的机会也不太多。我理解抽象工厂相比较于工厂方法模式的不同主要体现在以下2点:

1、工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个

2、工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个

展开来说就是:

工厂方法模式:

  • 一个抽象产品类,可以派生出多个具体产品类
  • 一个抽象工厂类,可以派生出多个具体工厂类
  • 每个具体工厂类只能创建一个具体产品类的实例

抽象工厂方法:

  • 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
  • 一个抽象工厂类,可以派生出多个具体工厂类
  • 每个具体工厂类可以创建多个具体产品类的实例

除了这2点之外,我还没有理解到有其他的不同。

案例

下面我们通过例子来说明抽象工厂方法的使用。

如下图中的类关系图。在抽象工厂中我们有了多个产品,相对于工厂方法模式只有一个汽车产品,而抽象工厂方法模式中我们有云服务器产品、云数据库产品,对应的产品的厂家是阿里云和腾讯云,然后对应的厂家分别通过工厂去生产者2种产品。 AliDataBase.png

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、工厂方法模式适用于是一个产品等级结构,而抽象工厂方法适用于多个产品等级结构的场景。