产品

设计模式之抽象工厂模式

2023-02-10  本文已影响0人  Tinyspot

1. 抽象工厂模式

1.1 组成

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()方法,从而获得具体对象

上一篇 下一篇

猜你喜欢

热点阅读