工厂模式
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
- one abstract class as abstract method
- product side
- abstract product
- concrete products which extends the abstract one
2. 使用场景
- 当我们的对象生成需要某些逻辑运算的时候,比如需要根据一些传入的参数来决定生成什么样子的对象
3. 使用目的
- 将对象的生成和使用解耦,方便对于一组对象的维护,根据一些条件来生成指定的对象
4. 具体实现
4.1 接口和数据对象定义
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
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 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" 转载请保留原文链接及作者。