创建型设计模式
关注如何实例化一个对象或一组相关的对象
- 对象创建过程涉及逻辑判断:比如你需要在对象创建时检查参数的合法性,或者根据某些条件创建不同的对象。
- 需要避免代码重复:如果对象的创建逻辑在多个地方使用,工厂模式可以集中管理这些逻辑,减少重复代码。(复用)
- 对象的创建过程可能会变化:如果对象创建的方式未来会发生变化(如引入新的属性或创建过程),通过工厂模式,你只需要修改工厂,而不需要在代码中每个地方都去修改对象的创建方式。
- 代码可维护性要求高:将复杂的创建逻辑放在工厂里,可以减少代码耦合,方便后续扩展和维护。
简单工厂模式
将对象的创建逻辑集中到工厂类和工厂方法上
ts
//房门的接口
class WoodenDoor {
width:number;
height:number;
constructor(width:number, height:number) {
this.width = width;
this.height = height;
}
getWidth():number {
return this.width;
}
getHeight():number {
return this.height;
}
}
//工厂,制造房门
const DoorFactroy = {
makeDoor: (width:number, height:number):WoodenDoor => {
return new WoodenDoor(width, height);
}
}
const door: WoodenDoor = DoorFactroy.makeDoor(10, 20);
console.log(door.getWidth(), door.getHeight());抽象工厂模式
在基类中处理通用流程,而让继承子类去扩展一些特殊的操作,从而通过 new 不同的子类动态确定不同的创建行为。
js
// 面试官接口,定义askQuestions()方法
class Developer {
askQuestions() {
console.log("询问设计模式问题!");
}
}
class CommunityExecutive {
askQuestions() {
console.log("询问社区建设问题!");
}
}
// 招聘经理的基类,定义了通用的面试流程
class HiringManager {
// 通用面试流程:创建面试官并询问问题
takeInterview() {
const interviewer = this.makeInterviewer();
interviewer.askQuestions();
}
// 工厂方法,子类需要实现它来返回具体的面试官
makeInterviewer() {
throw new Error("This method should be overridden by subclass");//强制子类必须实现(重载)该方法
}
}
// 开发经理类,负责为开发岗位面试
class DevelopmentManager extends HiringManager {
// 返回开发类的面试官
makeInterviewer() {
return new Developer();
}
}
// 市场经理类,负责为市场岗位面试
class MarketingManager extends HiringManager {
// 返回市场类的面试官
makeInterviewer() {
return new CommunityExecutive();
}
}
// 使用DevelopmentManager进行开发岗位的面试
const devManager = new DevelopmentManager();
devManager.takeInterview(); // 输出:询问设计模式问题!
// 使用MarketingManager进行市场岗位的面试
const marketingManager = new MarketingManager();
marketingManager.takeInterview(); // 输出:询问社区建设问题!其实这个例子就是 OOP 的多态: 当然可以,以下是修改后的内容,标题使用了**的形式:
多态的要求
多态是面向对象编程中的一个重要概念,它允许不同类型的对象以相同的接口调用相同的方法,尽管具体的实现可能各不相同。要满足多态的要求,通常需要以下几个条件:
1. 相同的接口
- 不同的类需要实现相同的方法接口。这意味着这些类必须具有相同的方法名和参数列表。例如,多个类可以实现
speak()方法,但具体的实现可以不同。
2. 继承关系
- 至少有一个基类(父类)和多个子类。子类需要继承自基类,以便可以替换基类的方法或实现基类定义的方法。基类可以定义通用的方法,子类可以提供具体的实现。
3. 方法重写(Override)
- 子类需要重写基类中的方法。多态性通常通过方法重写实现,子类提供自己的实现,而不是简单地使用从基类继承的方法。
4. 动态绑定(Dynamic Binding)
- 多态在运行时发生,具体的实现会在运行时根据对象的实际类型来决定(创建哪个子类的对象),而不是在编译时。这种动态绑定机制使得能够调用在运行时确定的特定类的方法。
5. 对象引用
- 多态允许使用父类的引用来指向子类的对象。这意味着你可以创建一个父类类型的变量,并将其指向任何子类的对象。例如,可以将
Animal类型的变量指向Dog或Cat对象。