定义:抽象工厂模式就是:围绕一个超级工厂类,创建其他工厂类;再围绕工厂类,创建实体类。
相较于传统的工厂模式,它多出了一个超级工厂类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
应用举例:比如你附件可能有一些肯德基店铺、肯德基旗下的炸鸡分类下有许多产品,但是我只想要其中的一种炸鸡,比如喜欢吃原味鸡,或者吮指鸡,有的小伙伴喜欢孜然鸡等等,这个时候抽象工厂就发挥作用了。
// 首先准备我们的实体类,还是使用之前的工厂模式的案例讲解
class Dog{
run(){
console.log('Dog-----')
}
}
class Cat{
run(){
console.log('Cat-----')
}
}
// ****************************
class Male{
run(){
console.log('male-----')
}
}
class Femail{
run(){
console.log('female-----')
}
}
// 然后准备我们的工厂类
/*假设 Cat 和 Dog,属于 Animal 工厂的产品;Male 和 Female 属于 Person 工厂的产品。所以需要实现 2 个工厂类:Animal 和 Person。
由于工厂类上面还有个超级工厂,为了方便工厂类生产实体,工厂类应该提供生产实体的方法接口。
为了更好的约束工厂类的实现,先实现一个抽象工厂类:*/
class AbstrctFactory{
getPersion(){
throw new Error('请先实现子类方法')
}
getAnimal(){
throw new Error('请先实现子类方法')
}
}
// 实现了抽象工厂之后,开始我们的Persion工厂和Animal工厂的创建
class PersonFactory extends AbstrctFactory{
getPersion(persion){
switch (persion) {
case 'male':
return new Male();
case 'female':
return new Female();
default:
break;
}
}
getAnimal(){
return null;
}
}
class AnimalFactory extends AbstrctFactory{
getAnimal(animal){
animal = animal.toLowerCase();
switch (animal) {
case 'dog':
return new Dog();
case 'cat':
return new Cat();
default:
break;
}
}
getPersion(){
return null;
}
}
// 最后实现我们的超级工厂类
class superFactory{
constructor(type){
switch (type) {
case 'persion':
return new PersonFactory();
case 'animal':
return new AnimalFactory();
default:
break;
}
}
}
// 最后开始我们的调用代码测试
// 首先我们根据抽象工厂创建persion工厂,可以获取到getPersion方法
let persion = new superFactory('persion');
// 然后根据persion工厂类便可以获取真正的persion分类个体mail与femle
let male = persion.getPersion('male');
// 最后调用子类的具体方法
male.run() // male
// 注意:最上面的抽象工厂中,如果子类工厂persion或者animal没有实现getPersion或者getAnimail方法,那么会抛出错误
// 以下为AnimalFactory测试
let animal = new superFactory('animal');
let dog = animal.getAnimal('Dog');
dog.run();
// 细心的小伙伴发现了我在创建animal工厂的时候加入了一行统一小写的代码----> animal = animal.toLowerCase();
// 其实正常来说,为了防止报错,不管调用者传入的名称是大写还是 小写都能找到对应的方法去实例化
使用场景:
1、QQ 换皮肤,一整套一起换。
2、生成不同操作系统的程序。
3、网页字体更换,UI主题更换等等
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。












网友评论