美文网首页产品
设计模式之抽象工厂模式

设计模式之抽象工厂模式

作者: Tinyspot | 来源:发表于2023-02-10 20:36 被阅读0次

1. 抽象工厂模式

  • 抽象工厂模式(Abstract Factory Pattern)指提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类
  • 抽象工厂可以称为其他工厂的工厂,它可以在抽象工厂中创建出其他工厂
  • 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象
  • 引入“产品族”的概念

1.1 组成

  • 抽象工厂(IAbstractFactory)
  • 具体工厂(ConcreteFactory)
  • 抽象产品(IAbstractProduct)
  • 具体产品(ConcreteProduct)

1.2 工厂方法 vs 抽象工厂

工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构

2. 实战

image.png

抽象工厂

public interface IFactory {
    IUser createUser();
    IDepartment createDepartment();
}

抽象产品

public interface IUser {
    void insert();
}
public interface IDepartment {
    void insert();
}

具体工厂

public class MysqlFactory implements IFactory {
    @Override
    public IUser createUser() {
        return new MysqlUser();
    }
    @Override
    public IDepartment createDepartment() {
        return new MysqlDepartment();
    }
}

public class OracleFactory implements IFactory {
    @Override
    public IUser createUser() {
        return new OracleUser();
    }
    @Override
    public IDepartment createDepartment() {
        return new OracleDepartment();
    }
}

具体产品

public class MysqlUser implements IUser {
    @Override
    public void insert() {
        System.out.println("mysql: insert user");
    }
}

public class OracleUser implements IUser {
    @Override
    public void insert() {
        System.out.println("oracle: insert user");
    }
}
public class MysqlDepartment implements IDepartment {
    @Override
    public void insert() {
        System.out.println("msyql: insert department");
    }
}

public class OracleDepartment implements IDepartment {
    @Override
    public void insert() {
        System.out.println("oracle: insert department");
    }
}

测试

@Test
public void test() {
    // 指定需要使用的数据库工厂实例
    IFactory factory = new MysqlFactory();
    IUser userDao = factory.createUser();
    userDao.insert();

    IDepartment departmentDao = factory.createDepartment();
    departmentDao.insert();
}

3. 优化

去掉 if 分支逻辑,比较经典处理方法就是利用多态
所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合

4. 抽象工厂模式在spring源码中的应用

在Spring中,所有工厂都是BeanFactory的子类。通过对BeanFactory的实现,我们可以从Spring的容器访问Bean。根据不同的策略调用getBean()方法,从而获得具体对象

相关文章

网友评论

    本文标题:设计模式之抽象工厂模式

    本文链接:https://www.haomeiwen.com/subject/zzokkdtx.html