用示例代码来帮你了解抽象工厂模式
对于“设计模式”这个词大家肯定都不陌生,很多框架也用到了设计模式,但是大部分的开发者应该是没有深入的了解过,我准备硬肝下这23设计模式作为专题文章的开端,一共23种设计模式,我尽量在<23天肝完。
为什么要学习设计模式:https://blog.csdn.net/kaituozhe_sh/article/details/107922339
在我大学四年,对设计模式也没有什么概念,写代码就想着能实现就可以了,不会有设计模式那样的思想,但是当学习到了框架的时候,对于设计模式才有了一些更深入的了解,使用设计模式的代码在扩展性上会比暴力的代码更容易维护,特别是当一个程序猿离职了后,你去接手它的代码,里面是一大堆if else,这样真的会崩溃,修改都不知道从何下手
硬肝系列目录
创建型模式
结构型模式
行为型模式
一、什么是抽象工厂模式
说到抽象工厂模式前,首先需要理解两个概念,一个是类别,一个是族群。
类别:鼠标、键盘、显示器…
族群:
大族群:
鼠标:mac鼠标、dell鼠标..
键盘:mac键盘、dell键盘..
从上面的结构可以看得出来我的出一个结论,使用抽象工厂模式创造出来的代码,纵向扩展容易,横向扩展困难,为什么呢?接下来我用代码了带大家来了解一下抽象工厂模式。
Mouse接口:
package designModels.AbstractModels;
public interface Mouse {
void sayHello();
}
keyboard接口:
package designModels.AbstractModels;
public interface keyboard {
void sayHello();
}
上面这两个接口就是族群里的大族群抽象接口:鼠标和键盘,下面为鼠标的实现类:
MacMouse实现Mouse接口:
package designModels.AbstractModels;
public class MacMouse implements Mouse{
@Override
public void sayHello() {
System.out.println("hello i'm MacMouse!!!");
}
}
DellMouse实现Mouse接口:
package designModels.AbstractModels;
public class DellMouse implements Mouse{
@Override
public void sayHello() {
System.out.println("hello i'm DellMouse!!!");
}
}
下面为键盘族群的实现类:
MacKeyboard实现keyboard接口:
package designModels.AbstractModels;
public class MacKeyboard implements keyboard{
@Override
public void sayHello() {
System.out.println("hello i'm MacKeyboard!!!");
}
}
DellKeyboard实现keyboard接口:
package designModels.AbstractModels;
public class DellKeyboard implements keyboard{
@Override
public void sayHello() {
System.out.println("hello i'm DellKeyboard!!!");
}
}
接下来才是抽象工厂类最重要的一步,不是为两个大族群(鼠标、键盘)创建工厂类,而是根据大族群里的类别(也就相当于mac、dell两个厂商),因为是厂商帮你创建的Mouse与Keyboard,这样极大方便了我们的使用,只要调用对应的方法即可购买到我们想要的鼠标,将使用者与创建者解耦合,方便维护,也方便横向扩展。
下面为抽象工厂接口:
package designModels.AbstractModels;
public interface Factory1 {
Mouse createMouse();
keyboard createKeyboard();
}
MacFactory:
package designModels.AbstractModels;
public class MacFactory implements Factory1{
@Override
public Mouse createMouse() {
//返回MacMouse对象
return new MacMouse();
}
@Override
public keyboard createKeyboard() {
//返回MacKeyboard对象
return new MacKeyboard();
}
}
DellFactory:
package designModels.AbstractModels;
public class DellFactory implements Factory1{
@Override
public Mouse createMouse() {
//返回dellMouse对象
return new DellMouse();
}
@Override
public keyboard createKeyboard() {
//返回dellKeyboard对象
return new DellKeyboard();
}
}
main方法测试:
package designModels.AbstractModels;
public class test {
public static void main(String[] args) {
//创建一个dell工厂
Factory1 factory1 = new DellFactory();
//调用工厂中的方法创建一个mouse对象
Mouse mouse1 = factory1.createMouse();
//调用对象方法
mouse1.sayHello();
}
}
返回结果:
hello i'm DellMouse!!!
缺点:
这个缺点要重点说一下,对于现有族群里存在的对象非常友好,新增工厂类即可完成对代码的扩展,不会影响到之前的代码,但是再加一个类别则会破坏OCP原则。因为需要对抽象工厂类的代码更改,还有一个优化,使用抽象类继承接口,这样即使抽象类中新增了方法,实现类也可以不一定要实现。
最后来说一下我们的调用流程:
抽象工厂——>具体的工厂——>返回具体实现类——>调用类中的方法
完成:TO: 2021/3/15 21:22