硬肝系列:23种设计模式之抽象工厂模式

用示例代码来帮你了解抽象工厂模式

对于“设计模式”这个词大家肯定都不陌生,很多框架也用到了设计模式,但是大部分的开发者应该是没有深入的了解过,我准备硬肝下这23设计模式作为专题文章的开端,一共23种设计模式,我尽量在<23天肝完。

为什么要学习设计模式:https://blog.csdn.net/kaituozhe_sh/article/details/107922339

在我大学四年,对设计模式也没有什么概念,写代码就想着能实现就可以了,不会有设计模式那样的思想,但是当学习到了框架的时候,对于设计模式才有了一些更深入的了解,使用设计模式的代码在扩展性上会比暴力的代码更容易维护,特别是当一个程序猿离职了后,你去接手它的代码,里面是一大堆if else,这样真的会崩溃,修改都不知道从何下手
在这里插入图片描述

硬肝系列目录

创建型模式

23种设计模式之工厂模式

23种设计模式之抽象工厂模式

23种设计模式之建造者模式

23种设计模式之原型模式

23种设计模式之单例模式

结构型模式

23种设计模式之适配器模式

23种设计模式之桥梁模式

23种设计模式之代理模式

23种设计模式之外观模式

23种设计模式之装饰器模式

23种设计模式之享元模式

23种设计模式之组合模式

行为型模式

23种设计模式之责任链模式

23种设计模式之命令模式

23种设计模式之迭代器模式

23种设计模式之中介者模式

23种设计模式之备忘录模式

一、什么是抽象工厂模式

说到抽象工厂模式前,首先需要理解两个概念,一个是类别,一个是族群
类别:鼠标、键盘、显示器…

族群:
	大族群:
		鼠标: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两个厂商),因为是厂商帮你创建的MouseKeyboard,这样极大方便了我们的使用,只要调用对应的方法即可购买到我们想要的鼠标,将使用者与创建者解耦合,方便维护,也方便横向扩展。

下面为抽象工厂接口

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉淀顶峰相见的PET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值