抽象工厂模式

抽象工厂模式

为什么需要工厂模式?

用于实现业务层与数据层进行解耦,比如,一个项目此时使用的是oracle,现在要修改成mysql,如果运用此模式则只需要修改一次程序代码(即初始化工厂代码)。

什么是抽象工厂模式?

提供一个创建一系列相关的或相互依赖抽象的接口,而无需指定它们具体的类。

抽象工厂模式的抽象实现

uml图

image-20220122221035195

逻辑说明

抽象工厂接口(AbstractFactory)中定义了创建两种产品的方法,两个不同的具体工厂类(代表不同的数据库管理系统)实现抽象工厂中的接口,不同的工厂类重写该方法对应于不同的产品(数据库),从而实现不同数据库的数据表可以通过相同的方法访问。

抽象工厂类

public interface AbstractFactory {
    AbstractProductA createProductA();
    AbstractProductB createProductB();
}

抽象产品A类,B类

每一种方法可代表不同的数据库环境,不同的方法是不同的功能。不同的抽象产品接口代表不同的产品。

public interface AbstractProductA {
    void methodA1();
    void methodA2();
}

public interface AbstractProductB {
    void methodB1();
    void methodB2();
}

具体工厂1类,2类

public class ConcreteFactory1 implements AbstractFactory{

    @Override
    public AbstractProductA createProductA() {
        System.out.println("创建产品A1");
        return new ProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        System.out.println("创建产品B1");
        return new ProductB1();
    }
}

public class ConcreteFactory2 implements AbstractFactory{

    @Override
    public AbstractProductA createProductA() {
        System.out.println("创建产品A2");
        return new ProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        System.out.println("创建产品B2");
        return new ProductB2();
    }
}

具体产品A1,A2,B1,B2类

public class ProductA1 implements AbstractProductA{
    @Override
    public void methodA1() {
        System.out.println("productA1实现的methodA1");
    }

    @Override
    public void methodA2() {
        System.out.println("productA1实现的methodA2");
    }
}

public class ProductA2 implements AbstractProductA{
    @Override
    public void methodA1() {
        System.out.println("productA2实现的methodA1");
    }

    @Override
    public void methodA2() {
        System.out.println("productA2实现的methodA2");
    }
}

public class ProductB1 implements AbstractProductB{
    @Override
    public void methodB1() {
        System.out.println("productB1实现的methodB1");
    }

    @Override
    public void methodB2() {
        System.out.println("productB1实现的methodB2");
    }
}

public class ProductB2 implements AbstractProductB{
    @Override
    public void methodB1() {
        System.out.println("productB2实现的methodB1");
    }

    @Override
    public void methodB2() {
        System.out.println("productB2实现的methodB2");
    }
}

使用类

public class App {
    public static void main(String[] args) {
//        AbstractFactory factory = new ConcreteFactory1();可通过修改初始化工厂的代码来适应不同的运行环境
        AbstractFactory factory = new ConcreteFactory2();
        AbstractProductA productA = factory.createProductA();
        productA.methodA1();
        productA.methodA2();
        AbstractProductB productB = factory.createProductB();
        productB.methodB1();
        productB.methodB2();
    }
}
//效果打印:
//    创建产品A1
//    productA1实现的methodA1
//    productA1实现的methodA2
//    创建产品B1
//    productB1实现的methodB1
//    productB1实现的methodB2

//    创建产品A2
//    productA2实现的methodA1
//    productA2实现的methodA2
//    创建产品B2
//    productB2实现的methodB1
//    productB2实现的methodB2

不足之处

增加一个产品时,需要增加产品类,修改工厂类,并且我们修改运行环境采取的方法是修改编译前的代码,可以通过反射来设置变量作为初始化工厂类的标志,做到编译到运行时修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值