欢迎看看我的图床

Thoughts on Independent Blog Writing


写作的过程其实也是一个发现的过程。最重要的一点首先是发现自己,发现自己拥有了什么。因为人类的情感是相通的,人类的思维也是相通的。当你发现自己拥有了什么的时候,写出来以后,如果大家都会产生共鸣的话,那就意味着你写下的是一个普遍的东西,而不是一个个人的东西了。 —— 余华老师关于写作建议

Read more ⟶

Telegram Bot for GitHub Actions


Make a Telegram bot with Node.js and use it with GitHub Actions for sending notifications to you about the repo.
Read more ⟶

Hugo shortcodes


Here is a demo of all shortcodes available in Hugo.
Read more ⟶

Github Actions自动部署Hexo博客至个人服务器


hexo作为一款优秀的静态博客生成器有着一些显著的优点如免费快速简洁轻量,但也存在一些明显的缺点例如更换电脑不便需要重新安装环境,无法在线写文章(修改文章),随着文章和插件的增加hexo三连的速度会越来越慢,使用github actions集成化部署再配合hexoplusplus可以在很大程度上改善hexo的使用体验。

 个人服务器是自建了 git 库,利用 hook 钩子发布到网站根目录。所以这篇教程最终是利用 hexo deploy 进行上传到服务器操作。

获取token

获取token是为了保证上传到GitHub公开的网站仓库(编译后的静态页面存放的仓库)有足够的权限可以上传,如果你只是要部署到服务器不同步到GitHub page可以忽略这一步。

登录GitHub点击该链接再点击generate new token,创建token名称可以随意填写,但是必须勾选全部的repo,其他权限不用勾选。

必须勾选全部的repo

必须勾选全部的repo

生成token后请复制保存到安全的地方确保已经正确记录token因为token只会显示这一次,如果忘记了只能重新生成,这样做也是为了保护账号安全防止被人盗取token为所欲为。

Read more ⟶

JS工厂模式


1 工厂模式

1.1 什么是工厂模式

工厂模式的名字很直白,封装的模块就是一个工厂一样批量的产出需要的对象。常见的工厂模式的体征就是调用的时候不需要new,而且传入的参数比较简单。

工厂模式它的领域中同其他模式的不同之处在于它并没有明确要求我们使用一个构造器。取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创造的工厂对象的类型。

1.2 为什么需要工厂模式

假设我们需要通过一个类来换取不同的对象实例,可能会写出如下代码:

class Dog{
  draw(){
      console.log('this is Dog');
  }
}
class Cat{
    draw() {
        console.log('this is Cat');
    }
}
class Pig{
     draw() {
        console.log('this is Pig');
    }
}
class Animal{
    getTypeAnimal(type){
        switch(type){
            case 'dog':
                return new Dog();
             case 'cat':
                return new Cat();
             case 'pig':
                return new Pig()
        }
    }
}

上面的代码中我们通过Animal类并为其提供了一个获取不同实例对象的方法getTypeAnimal。在使用时我们只需要new Animal, 然后通过这个工厂类实例对象提供的接口,传入不同的type,就可以给我们返回不同的实例对象。

 const animal = new Animal();
 dog = animal.getTypeAnimal('dog');
 cat = animal.getTypeAnimal('cat');
 pig = animal.getTypeAnimal('pig')

上面的代码中不是很优雅, 当我们需要工厂类需要生产的类越多,switch要加更多的判断。此时我们可以通过ES6的新的数据结构来建立type 和 类的联系,方便直接获取到对应的实例对象;

假设我们有如上的三个基本类,那么我们可以写成如下代码

class Animal {
      constructor() {
          // 创建一个map
          const map = new Map();
          // 通过map的set链式设置对应的键值对
          map.set('dog', Dog).set('cat', Cat).set('pig', Pig);
          // 将map挂载实例对象
          this.AnimalMap = map;
      }
      getTypeAnimal(type) {
          // 返回type 对应的实例对象
          return new (this.AnimalMap.get(type))
      }
      add(type,target) {
          // 新增type对应的类
          this.AnimalMap.set(type, target)
      }
  }
  const animal = new Animal();
  let dog = animal.getTypeAnimal('dog'),
      cat = animal.getTypeAnimal('cat'),
      pig = animal.getTypeAnimal('pig');
  class Cow{}
 animal.add('cow', Cow);// 添加一个新的动物类
 let cow = animal.getTypeAnimal('cow', Cow);
 console.log(cow);// Cow{}

上面的代码我们通过ES6的Map加强数据结构,来保存每给类型所对应的类,通过键值对来设置type对应的类, 然后当我们获取是的时候通过map的get方法获取type所对应的类,然后通过new 返回出去。这种写法更加优雅,减少了代码的耦合性,更利于维护。

Read more ⟶