工厂模式

  1. 1.工厂模式Overview
  2. 2. 使用场景
  3. 3. 使用目的
  4. 4. 具体实现
    1. 4.1 接口和数据对象定义
    2. 4.2 具体实现类的定义
    3. 4.3 测试
  5. Reference

1.工厂模式Overview

Define an interface for creating an object, but let’s subclasses decide which class to instantiate. Factory method lets a class defer instantiation to subclasses.

  • 出现工厂模式是因为我们不希望将实现和类的声明进行强绑定,我们希望整体在一个松耦合的状态
    • 我们希望达到的理想状态是 Open for extension, Close for modification.
  • Interface 定义出了一个contract,规定了我们是如何在各个类之间进行交互的
  • 我们使用面向接口的编程方式,主要目的是对各种改动会更加友好,写的代码会通过Java多态的特性自动对实现了这个接口的新类可用
  • Factory — 封装对象的创建过程
    • 专门负责创建出新的对象,让工厂根据条件去生产出新的对象
    • 使用static factory
      • 因为按道理也不应该因为要使用create方法就实例化一个对象
      • 但是坏处是不能够去创建子类,或者改变create方法本身了
  • creator side
    • one abstract class as abstract method
      • could delegate some method to subclass
      • but for common one, we should define here, and subclass could override if they want
    • a set of subclass implements the abstract methods
  • product side
    • abstract product
    • concrete products which extends the abstract one

2. 使用场景

  • 当我们的对象生成需要某些逻辑运算的时候,比如需要根据一些传入的参数来决定生成什么样子的对象

3. 使用目的

  • 将对象的生成和使用解耦,方便对于一组对象的维护,根据一些条件来生成指定的对象

4. 具体实现

4.1 接口和数据对象定义

class diagram

public abstract class Animal {

    String name;

    public abstract void bark();
}

public interface IAnimalFactory {
    Animal createAnimal(String type);
}

4.2 具体实现类的定义

public class Cat extends Animal {
    public Cat(String name) {
        this.name = name;
    }
    @Override
    public void bark() {
        System.out.println("miao");
    }
}

public class Dog extends Animal {
    public Dog(String name) {
        this.name = name;
    }
    @Override
    public void bark() {
        System.out.println("wang");
    }
}

public class RandomFactory implements IAnimalFactory {
    @Override
    public Animal createAnimal(String name) {
        Random random = new Random();
        int num = random.nextInt(2);

        var list = Arrays.asList("cat", "dog");
        switch(list.get(num)) {
            case "cat":
                return new Cat(name);
            case "dog":
                return new Dog(name);
            default:
                return null;
        }
    }
}

4.3 测试

@GetMapping("/factory")
    public String factory() {
        RandomFactory randomFactory = new RandomFactory();
        randomFactory.createAnimal("test").bark();
        randomFactory.createAnimal("test").bark();
        randomFactory.createAnimal("test").bark();
        randomFactory.createAnimal("test").bark();
        randomFactory.createAnimal("test").bark();

        return "check the log";
    }

Reference

  1. https://www.youtube.com/watch?v=EcFVTgRHJLM

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 stone2paul@gmail.com

文章标题:工厂模式

文章字数:623

本文作者:Leilei Chen

发布时间:2022-12-05, 21:24:32

最后更新:2022-12-05, 21:26:47

原始链接:https://www.llchen60.com/%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏