工厂模式

工厂模式(Factory Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

使用场景:业务方面:在处理奖惩、订单、押金、保险的流水时,不同的类型单独处理;

                  通用业务:日志记录,日志记录到本地还是远程服务器;数据库访问;

一、简单工厂

实现:根据创建接口传入的类型来选择返回的创建对象

成员:产品接口类(或抽象类)、产品实现类、工厂类

缺点:新增一种实现类需要再工厂类中添加判断,违背开闭原则

/**
 * 简单工厂模式
 * 根据参数code来选择对应的产品
 * 新增一种产品需要添加判断,更改工厂内的方法
 * 违背开闭原则
 * Created by wanghh on 2018-8-23.
 */
public class SimpleFactory {
    public static AbstractProdtctService createProductService(Integer code) {
        if (code == null) {
            return null;
        }
        switch (code) {
            case 1:
                return SpringContextFactory.getBean(AProdtctServiceImpl.class);
            case 2:
                return SpringContextFactory.getBean(BProdtctServiceImpl.class);
            case 3:
                return SpringContextFactory.getBean(CProdtctServiceImpl.class);
            default:
                return SpringContextFactory.getBean(AProdtctServiceImpl.class);
        }
    }
}

二、工厂方法

实现:将简单工厂类SimpleFactory拆分为抽象工厂类和具体工厂类,创建对象在具体工厂类中,其决定具体实例化的对象

成员:抽象产品接口类(或抽象类)、具体产品类、抽象工厂、具体工厂

优点:克服简单工厂违背的开闭原则,当新增一个产品时,只要新增一个具体工厂类即可

缺点:系统中类的个数将成对增加,在一定程度上增加了系统的复杂度

/**
 * 工厂方法
 * 创建对象的操作延迟到具体工厂里实现
 * 新增一种产品,只需新增一种具体工厂
 */
public interface AbstractFactory {
    ProdtctService createProductService();
}

/**
 * A具体工厂
 */
public class AFactory implements AbstractFactory{
    @Override
    public ProdtctService createProductService() {
        return new AProdtctServiceImpl();
    }
}

/**
 * B具体工厂
 */
public class BFactory implements AbstractFactory{
    @Override
    public ProdtctService createProductService() {
        return new BProdtctServiceImpl();
    }
}

/**
 * C具体工厂
 */
public class CFactory implements AbstractFactory{
    @Override
    public ProdtctService createProductService() {
        return new CProdtctServiceImpl();
    }
}

三、抽象工厂

抽象工厂是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

成员:抽象工厂、具体工厂1、具体工厂2、抽象产品A、抽象产品B、具体产品A1、具体产品A2、具体产品B1、具体产品B2

场景:系统的产品多于一个产品族,而系统只消费某一族的产品。

缺点:类个数较多,程序复杂性增加,新增一种产品,需要更改多个类

原文地址:https://www.cnblogs.com/tilamisu007/p/9525937.html