前言

工厂模式(Factory Pattern)是一种非常常用的创建型设计模式,提供了创建对象的最佳方式。在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象。

简单记录一下,方便自己查阅。

正文

工厂模式一般分为3类:

  1. 简单工厂模式(Simple Factory)

  2. 工厂方法模式(Factory Method)

  3. 抽象工厂模式(Abstract Factory)

demo抄于参考文1,懒得单独写了

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

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

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

简单工厂模式

定义:定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。

适用场景
  1. 需要创建的对象较少。  

  2. 客户端不关心对象的创建过程。

demo

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

// 手游游戏接口定义
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;
        }
    }
}

调用方式

// 创建射击类游戏并启动
MobileGame sheJiGame = MobileGameFactory.createGame("SheJi");
sheJiGame.run();

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

从上面可以看出,调用的地方不需要知道对象创建过程,只需传入对应type即可。

优缺点
  1. 优点:简单易懂,根据传入的参数决定创建哪种具体的产品。

  2. 缺点:不符合开闭原则(对扩展开放,对修改关闭),因为当添加新的产品类型时,需要修改工厂类的创建方法。

工厂方法模式

定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。

适用场景
  1. 客户端不需要知道它所创建的对象的类。

  2. 客户端可以通过子类来指定创建对应的对象。

demo

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

// 手游游戏接口定义
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();
    }
}

使用方法

// 创建射击游戏并启动
MobileGame sheJiGame = new SheJiGameFactory().createGame();
sheJiGame.run();
// 创建魔法游戏并启动
MobileGame moFaGame = new MoFaGameFactory().createGame();
moFaGame.run();
优缺点
  1. 优点:符合开闭原则,当需要添加新的产品时,只需要添加新的具体产品类和工厂类。

  2. 缺点:当产品种类过多时,会有大量的工厂类存在,比较臃肿。

抽象工厂模式

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

抽象工厂模式是工厂方法的进一步深化,在这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象。

抽象工厂模式的主要角色:

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。

  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。

  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。

  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

demo

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

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

// 手游游戏接口定义
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();
    }
}

使用

// 创建射击类游戏工厂
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();
优缺点
  1. 优点:适用于创建对象的逻辑复杂且对象之间有一定关联的场景

  2. 缺点:实现复杂,不适合简单的场景。

参考文章

  1. 设计模式之工厂模式

  2. 设计模式之工厂模式(3种)详解及代码示例

  3. 浅谈设计模式——工厂模式

  4. Java设计模式之工厂模式)》

相关文章

暂无评论

none
暂无评论...