javaScript设计模式之简单工厂模式

简单工厂模式(Simple Factory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。

场景一

假设我们需要计算圆形和矩形的面积

javascript 复制代码
    function Circle(radius) {
        this.radius = radius;
    }

    Circle.prototype.getArea = function() {
        return Math.PI * this.radius * this.radius;
    };

    // 定义矩形构造函数
    function Rectangle(width, height) {
        this.width = width;
        this.height = height;
    }

    Rectangle.prototype.getArea = function() {
        return this.width * this.height;
    };

    // 定义简单工厂函数
    function ShapeFactory(shapeType, params) {
        var shape;
        if (shapeType === 'circle') {
            shape = new Circle(params.radius);
        } else if (shapeType === 'rectangle') {
            shape = new Rectangle(params.width, params.height);
        } else {
            throw new Error('请重新选择');
        }
        return shape;
    }

    // 使用简单工厂函数创建形状对象
    var circle = ShapeFactory('circle', { radius: 5 });
    var rectangle = ShapeFactory('rectangle', { width: 4, height: 10 });

    // 计算并打印形状的面积
    console.log('Circle area:', circle.getArea()); // 输出: Circle area: 78.53981633974483
    console.log('Rectangle area:', rectangle.getArea()); // 输出: Rectangle area: 40

两个构造函数CircleRectangle,它们分别表示圆形和矩形,并且都拥有一个getArea方法来计算面积。ShapeFactory是简单工厂函数,它接收一个形状类型shapeType和一个包含形状参数的params对象。根据shapeType的不同,工厂函数会创建并返回相应类型的形状对象。最后用ShapeFactory函数来创建圆形和矩形对象,并调用它们的getArea方法来计算面积。

场景二

创建不同类型的动物对象狗、猫。

javascript 复制代码
    // 定义动物基类
    class Animal {
        constructor(name) {
            this.name = name;
        }
        speak() {
            console.log(`${this.name} 叫`);
        }
    }
    // 定义狗类
    class Dog extends Animal {
        speak() {
            console.log(`${this.name} 狗`);
        }
    }
    // 定义猫类
    class Cat extends Animal {
        speak() {
            console.log(`${this.name} 猫`);
        }
    }
    // 定义简单工厂类
    class AnimalFactory {
        static createAnimal(type, name) {
            let animal;
            switch (type) {
                case 'dog':
                    animal = new Dog(name);
                    break;
                case 'cat':
                    animal = new Cat(name);
                    break;
                default:
                    throw new Error('Invalid animal type');
            }
            return animal;
        }
    }

    // 使用简单工厂创建动物对象
    let dog = AnimalFactory.createAnimal('dog', '旺财');
    let cat = AnimalFactory.createAnimal('cat', '小花');

    // 让动物发声
    dog.speak(); // 输出: 旺财 狗
    cat.speak(); // 输出: 小花 猫

定义了一个Animal基类,以及两个继承自Animal的子类DogCat。然后,我们创建了一个AnimalFactory简单工厂类,它有一个静态方法createAnimal,根据传入的类型参数type来创建并返回相应的动物对象。最后使用AnimalFactory来创建狗和猫的对象,并调用它们的speak方法。

场景三

创建不同类型的汽车对象

javascript 复制代码
// 定义汽车构造函数
function Car(model, year, color) {
  this.model = model;
  this.year = year;
  this.color = color;
}

// 定义简单工厂函数
function CarFactory() {}

// 工厂函数的原型上添加创建汽车的方法
CarFactory.prototype.createCar = function (type) {
  switch (type) {
    case 'SUV':
      return new Car('SUV', 2022, 'black');
    case 'Sedan':
      return new Car('Sedan', 2021, 'white');
    case 'Hatchback':
      return new Car('Hatchback', 2020, 'blue');
    default:
      throw new Error('Invalid car type.');
  }
};

// 使用简单工厂创建汽车对象
var factory = new CarFactory();
var suv = factory.createCar('SUV');
var sedan = factory.createCar('Sedan');
var hatchback = factory.createCar('Hatchback');

console.log(suv);
console.log(sedan);
console.log(hatchback);

最终输入

Car 构造函数用于创建汽车对象,而 CarFactory 则是一个简单工厂,用于根据指定的类型创建不同的汽车对象。

场景四

比如说体育商品店卖体育器材,里面有很多体育用品,及其相关介绍等。当你来到体育用品店买一个篮球和足球等,你只需要问售货员,他会帮你找到你所要的东西。

javascript 复制代码
    //蓝球
    let basketball=function(){
        this.intor="蓝球运动"
    }
    basketball.prototype={
        getMember:function () {
            console.log("需要的队员")
        },
        getBallsize:function () {
            console.log("蓝球很大")
        }
    }
    //足球
    let football=function () {
        this.intro="足球"
    }
    football.prototype={
        getMember:function () {
            console.log("需要11名队员")
        },
        getBallsize:function () {
            console.log("足球很大")
        }
    }
    //网球
    let tennis=function () {
        this.intro="每年有很多网球比赛"
    }
    tennis.prototype={
        getMember:function () {
            console.log("网球比赛很精彩")
        },
        getBallsize:function () {
            console.log("网球很好玩")
        }
    }
    //运动工大
    let sportsFactory=function (name) {
        switch (name) {
            case 'NAB':
                return new Basketball();
            case 'wordcup':
                return new football();
            case 'frenchopen':
                return new tennis()
        }
    }
    //进行使用 创建一个足球
    let footnall = sportsFactory('wordcup')
    console.log(footnall.intro)
    footnall.getMember()//需要11名队员

场景五

如果想创建一些书,那么这些书都有一些相似的地方,比如目录、页码等。也有一些不相似的地方,如书名、出版时间、书的类型等,对于创建的对象相似的属性好处理,对于不同的属性就要有针对性地进行处理了,比如我们将不同的属性作为参数传递进行处理。

javascript 复制代码
    function createBook(name,time,type) {
        //创建一个对象,并对对象拓展属性和方法
        let o = new Object()
        o.name=name
        o.time=time
        o.type=type
        o.getName=function () {
            console.log(this.name,this.time,this.type)
        }
        //将对象返回
        return o
    }
    let book1=createBook('语文',2024,'海')
    let book2=createBook('国学',2024,'论语')
    book1.getName()//语文 2024 海
    book2.getName()//国学 2024 论语

总结:通过对简单工厂模式来创建一些对象,可以让这些对象共用一些资源而又私有一些资源。不过对于简单工厂模式,它的使用场合通常也就限制在创建单一对象。

相关推荐
工业3D_大熊2 分钟前
【虚拟仿真】CEETRON SDK在船舶流体与结构仿真中的应用解读
java·python·科技·信息可视化·c#·制造·虚拟现实
lzb_kkk11 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
爬山算法35 分钟前
Maven(28)如何使用Maven进行依赖解析?
java·maven
编程、小哥哥1 小时前
设计模式之抽象工厂模式(替换Redis双集群升级,代理类抽象场景)
redis·设计模式·抽象工厂模式
2401_857439691 小时前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧6661 小时前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索1 小时前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
芒果披萨1 小时前
Filter和Listener
java·filter
qq_4924484461 小时前
Java实现App自动化(Appium Demo)
java
阿华的代码王国1 小时前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话