简单工厂模式
,又称静态工厂模式
,是通过一个工厂对象来决定创建某一种对象类的实例。这种设计模式属于创建型模式,能够根据不同的参数返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,这些实例通常具有共同的父类。
描述
简单工厂模式
的目的是定义一个创建对象的接口,让其子类自行决定实例化哪一个具体产品。工厂模式将创建过程延迟到工厂方法中,主要解决接口选择的问题,使子类能够实现工厂接口,并返回一个抽象的产品。
模式结构
Factory
:工厂角色,负责实现创建所有实例的内部逻辑。Product
:抽象产品角色,是所有被创建对象的父类,描述了所有实例共有的公共接口。ConcreteProduct
:具体产品角色,代表创建目标,所有创建的对象都是这个角色的具体类的实例。
实现
class Animal { // 基类
speak() {
console.log(this.sound);
}
}
class Dog extends Animal { // 狗
constructor() {
super();
this.sound = "Woof!";
}
}
class Cat extends Animal { // 猫
constructor() {
super();
this.sound = "Meow!";
}
}
class Bird extends Animal { // 鸟
constructor() {
super();
this.sound = "Chirp!";
}
}
class AnimalFactory { // 动物工厂
getAnimal(animalType) {
switch (animalType.toLowerCase()) {
case "dog":
return new Dog();
case "cat":
return new Cat();
case "bird":
return new Bird();
default:
throw new Error("未知动物类型");
}
}
}
const animalFactory = new AnimalFactory();
const dog = animalFactory.getAnimal("dog");
dog.speak(); // Woof!
const cat = animalFactory.getAnimal("cat");
cat.speak(); // Meow!
const bird = animalFactory.getAnimal("bird");
bird.speak(); // Chirp!
优点
- 工厂类集中管理了产品创建的逻辑,客户端无需直接创建产品对象,只需使用工厂提供的接口,从而实现责任分离。
- 客户端只需了解具体产品类对应的参数,无需记忆复杂的类名,简化了使用过程。
- 可以通过配置文件或其他方式增加新的具体产品类,而无需修改客户端代码,提升了系统灵活性。
缺点
- 工厂类集中处理所有产品的创建逻辑,一旦出现问题,可能影响整个系统。
- 使用简单工厂模式会增加系统中类的数量,可能导致系统复杂度提高,理解难度加大。
- 扩展系统较为困难,添加新产品时需修改工厂逻辑,可能导致工厂代码复杂,不利于维护。
- 由于使用静态工厂方法,工厂角色无法形成基于继承的等级结构。
原文链接: