1.简单工厂模式的定义
简单工厂模式(Simple Factory Pattern)定义为:简单工厂模式又称静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
2.简单工厂模式类图
简单工厂模式包含如下角色
1.Factory(工厂角色)
工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以被外部直接调用,创建所需的对象;在工厂类中提供静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。
2.Product(抽象产品角色)
抽象产品角色是简单工厂模式所创建所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
3.ConcreteProduct(具体产品角色)
具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法。
3.示例
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
1.修改前的类图
2.修改前的代码
<script>
// 抽象人类
class Person {
constructor(gender) {
this.gender = gender
}
}
// 男人类
class Man extends Person {
constructor(gender) {
super(gender)
}
}
// 女人类
class Women extends Person {
constructor(gender) {
super(gender)
}
}
// 女娲类
class Nvwa {
constructor(gender) {
this.gender = gender
}
createPerson(gender) {
switch (this.gender) {
case 'M' :
return new Man("男人")
break;
case 'W' :
return new Women("女人")
break;
}
}
}
</script>
3.修改后的类图
4.修改后的代码
<script>
// 抽象人类
class Person {
constructor(gender) {
this.gender = gender
}
}
// 男人类
class Man extends Person {
constructor(gender) {
super(gender)
}
}
// 女人类
class Women extends Person {
constructor(gender) {
super(gender)
}
}
// 机器人类
class Robot extends Person {
constructor(gender) {
super(gender)
}
}
// 女娲类
class Nvwa {
constructor(gender) {
this.gender = gender
}
createPerson(gender) {
switch (this.gender) {
case 'M' :
return new Man("男人")
break;
case 'W' :
return new Women("女人")
break;
case 'R' :
return new Robot("机器人")
break;
}
}
}
</script>
通过对比修改前后的代码,可以发现当需要新增一个具体类时,是需要修改Nvwa类的。那么这就违背了OCP(开闭原则)。
4.优点
提高了专门的工厂类用于创建对象。
5.缺点
使用简单工厂模式会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。