定义:定义一种创建对象的接口,让子类决定实例化哪一个工厂类,工厂模式使创建过长延迟到子类中执行
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
应用实例:
1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
ES6 实现
/*实体类,Dog、Cat等*/
class Dog{
run(){
console.log('Dog-----')
}
}
class Cat{
run(){
console.log('Cat-----')
}
}
/*工厂类Animal*/
class Animal{
constructor(type){
switch (type) {
case 'dog':
return new Dog();
case 'cat':
return new Cat();
default:
break;
}
}
}
let dog = new Animal('dog');
dog.run();
let cat = new Animal('cat');
cat.run()
// console.log(dog)
总结:工厂模式实现起来比较简单,主要是注意工厂模式不需要知道传入的实例是 什么,只关心从工厂里面输出的是什么。
就比如上面的例子,假如Animal是一个肉品加工厂,不需要关注是如何加工的,只需要给它一头猪,能够给我相应的猪肉相关的产品,比如经过一系列加工的香肠,本人最爱吃的猪肉脯等等,只需要知道名称,不关心其如何实现,这就是工厂模式的核心。
工厂模式的优点:
1、调用者想创建对象,只需要知道其名名称即可,不需要知道里面是如何实现的
2、扩展性高,如果想增加一个产品,扩展一个工厂类即可
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
网友评论