JavaScript实现设计模式--简单工厂模式

412 阅读2分钟

1.简单工厂模式的定义

简单工厂模式(Simple Factory Pattern)定义为:简单工厂模式又称静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

2.简单工厂模式类图

工厂方法模式类图 (1).png 简单工厂模式包含如下角色

1.Factory(工厂角色)

工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以被外部直接调用,创建所需的对象;在工厂类中提供静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。

2.Product(抽象产品角色)

抽象产品角色是简单工厂模式所创建所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。

3.ConcreteProduct(具体产品角色)

具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法。

3.示例

使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。

1.修改前的类图

简单工厂模式类图.png

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.修改后的类图

简单工厂模式修改后类图.png

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.缺点

使用简单工厂模式会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。