设计模式之工厂模式

目录

一、工作中的应用场景

二、编程实现方式

2.1 简单工厂模式

2.2 工厂方法模式

2.3 抽象工厂模式


工厂模式(Factory Pattern)是一种工作中经常会用到的创建型设计模式,它提供了一种创建对象的方式。将对象的创建和使用分离,把对象创建逻辑封装在工厂类中,而不是在客户端代码中直接实例化对象。这样做的好处是当需要创建新的对象或者修改对象创建逻辑时,只需要在工厂类中进行修改,而不会影响到使用这些对象的其他代码。

工厂模式有以下几种形式:

  • 简单工厂模式(Simple Factory Pattern):不是GoF设计模式之一,但它是其他两种工厂模式的基础。它通过一个工厂方法来创建对象,但是这个方法不属于任何接口或抽象类,而是一个具体的类。
  • 工厂方法模式(Factory Method Pattern):定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。
  • 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

以上这几种形式的实现复杂度、灵活度各有不同,工作中并不会严格的要求必须采用哪一种,通常会根据具体的使用场景去灵活的组合使用。

一、工作中的应用场景

工厂模式广泛应用于需要根据不同的条件创建不同实例的场景中,例如:

  • 同一个接口在不同业务场景下的参数校验:工作中有些接口是不同业务场景通用的,在进行入参合法性校验时往往需要根据不同业务场景的诉求实现自定义校验,此时可以使用工厂模式为不同业务场景创建对应的参数校验处理类。
  • 相同业务场景下不用业务线的自定义处理逻辑:例如互联网领域面向商家的佣金结算业务场景下有酒店、餐饮两个不同的业务线,平台在抽取佣金后需要将商家应得的那部分钱结算给商家,这个流程大概会涉及计算费用、汇总账单、打款、对账等环节,不用业务线在这些环节会有自定义的内部逻辑,此时就可以使用工厂模式创建不同业务线的处理类实现差异化逻辑。
  • 日志记录:根据配置文件中的设置创建不同级别的日志记录器。

二、编程实现方式

以创建不同平台、不同类型游戏的场景为例

手游:射击类游戏、魔法类游戏

端游:射击类游戏、魔法类游戏

2.1 简单工厂模式

手游游戏接口定义,并创建两个类型的手游:射击游戏、魔法游戏

// 手游游戏接口定义
public interface MobileGame {
    void run();
}

// 射击游戏类创建
public class SheJiGame implements MobileGame{
    @Override
    public void run() {
        System.out.println("启动射击游戏");
    }
}

// 魔法游戏类创建
public class MoFaGame implements MobileGame{
    @Override
    public void run() {
        System.out.println("启动魔法游戏");
    }
}

手游工厂类创建

public class MobileGameFactory {
    public static MobileGame createGame(String type){
        if(type.equals("SheJi")){
            return new SheJiGame();
        }else if(type.equals("MoFa")){
            return new MoFaGame();
        }else{
            return null;
        }
    }
}

使用方式

public class Test {
    public static void main(String[] args) {
        // 创建射击类游戏并启动
        MobileGame sheJiGame = MobileGameFactory.createGame("SheJi");
        sheJiGame.run();

        // 创建魔法类游戏并启动
        MobileGame moFaGame = MobileGameFactory.createGame("MoFa");
        moFaGame.run();
    }
}

优缺点:实现起来简单易懂,根据传入的参数决定创建哪种具体的产品。但这种模式不符合开闭原则(对扩展开放,对修改关闭),因为当添加新的产品类型时,需要修改工厂类的创建方法。

2.2 工厂方法模式

手游游戏接口定义,并创建两个类型的手游:射击游戏、魔法游戏

// 手游游戏接口定义
public interface MobileGame {
    void run();
}

// 射击游戏类创建
public class SheJiGame implements MobileGame{
    @Override
    public void run() {
        System.out.println("启动射击游戏");
    }
}

// 魔法游戏类创建
public class MoFaGame implements MobileGame{
    @Override
    public void run() {
        System.out.println("启动魔法游戏");
    }
}

手游工厂接口定义,并创建两个不同类型的手游工厂类:射击类游戏工厂、魔法类游戏工厂

// 手游工厂接口定义
public interface MobileGameFactory {
    // 创建游戏
    MobileGame createGame();
}

// 射击类游戏工厂类
public class SheJiGameFactory implements MobileGameFactory{
    @Override
    public MobileGame createGame() {
        return new SheJiGame();
    }
}

// 魔法类游戏工厂类
public class MoFaGameFactory implements MobileGameFactory{
    @Override
    public MobileGame createGame() {
        return new MoFaGame();
    }
}

使用方式

public class Test {
    public static void main(String[] args) {
        // 创建射击游戏并启动
        MobileGame sheJiGame = new SheJiGameFactory().createGame();
        sheJiGame.run();

        // 创建魔法游戏并启动
        MobileGame moFaGame = new MoFaGameFactory().createGame();
        moFaGame.run();
    }
}

优缺点:符合开闭原则,当需要添加新的产品时,只需要添加新的具体产品类和工厂类。但是当产品种类过多时,会有大量的工厂类存在,比较臃肿。

2.3 抽象工厂模式

手游游戏接口定义,并创建两个类型的手游:射击游戏、魔法游戏

端游游戏接口定义,并创建两个类型的端游:射击游戏、魔法游戏

// 手游游戏接口定义
public interface MobileGame {
    void run();
}

// 射击手游类创建
public class SheJiMobileGame implements MobileGame{
    @Override
    public void run() {
        System.out.println("启动射击手游游戏");
    }
}

// 魔法手游类创建
public class MoFaMobileGame implements MobileGame{
    @Override
    public void run() {
        System.out.println("启动魔法手游游戏");
    }
}


// PC端游戏接口定义
public interface PCGame {
    void run();
}

// 射击端游类创建
public class SheJiPCGame implements PCGame{
    @Override
    public void run() {
        System.out.println("启动射击端游游戏");
    }
}

// 魔法端游类创建
public class MoFaPCGame implements PCGame{
    @Override
    public void run() {
        System.out.println("启动魔法端游游戏");
    }
}

抽象工厂接口定义,定义两个方法:创建手游、创建端游。

创建两个具体的游戏工厂类:射击类游戏工厂、魔法类游戏工厂。

// 抽象游戏工厂接口定义
public interface GameFactory {

    // 创建手游
    MobileGame createMobileGame();

    // 创建端游
    PCGame createPCGame();
}

// 射击类游戏工厂
public class SheJiGameFactory implements GameFactory {
    
    // 创建射击手游类游戏
    @Override
    public MobileGame createMobileGame(){
        return new SheJiMobileGame();
    }

    // 创建射击端游类游戏
    @Override
    public PCGame createPCGame(){
        return new SheJiPCGame();
    }
}

// 魔法类游戏工厂
public class MoFaGameFactory implements GameFactory {
    
    // 创建魔法手游类游戏
    @Override
    public MobileGame createMobileGame(){
        return new MoFaMobileGame();
    }

    // 创建魔法端游类游戏
    @Override
    public PCGame createPCGame(){
        return new MoFaPCGame();
    }
}

实现方式:

public class Test {
    public static void main(String[] args) {
        // 创建射击类游戏工厂
        Factory sheJiGameFactory = new SheJiGameFactory();
        // 创建射击手游类游戏并启动
        MobileGame sheJiMobileGame = sheJiGameFactory.createMobileGame();
        sheJiMobileGame.run();
        // 创建射击端游类游戏并启动
        PCGame sheJiPCGame = sheJiGameFactory.createPCGame();
        sheJiPCGame.run();

        // 创建魔法类游戏工厂
        Factory moFaGameFactory = new MoFaGameFactory();
        // 创建魔法手游类游戏并启动
        MobileGame moFaMobileGame = moFaGameFactory.createMobileGame();
        moFaMobileGame.run();
        // 创建魔法端游类游戏并启动
        PCGame moFaPCGame = moFaGameFactory.createPCGame();
        moFaPCGame.run();
    }
}

优缺点:适用于创建对象的逻辑复杂且对象之间有一定关联的场景,但缺点是实现复杂,不适合简单的场景。


后续会在微信公众号持续同步工作中积累沉淀的技术类文章,欢迎感兴趣的伙伴关注订阅,方便浏览。

公众号名称:IT路旅记

二维码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值