设计模式之抽象工厂

36 篇文章 0 订阅
7 篇文章 0 订阅

1 背景回顾

设计模式是一种思维方式,前人总结的最佳实践,也是一种态度,一种进步。
软件过程里面设计模式一共有23种,一般分为3类。即创建型,结构性型,行为型。其中:
****创建型5种: **** 解决了创建对象的烦恼
单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式

结构性型7种: 解决了如何让类组合起来完成复杂的功能
适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式,

行为型11种: 解决了类之间的控制关系。
模版方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,状态模式,策略模式,职责链模式,访问者模式,解释器模式。

如果想要学习并掌握这些设计模式,最好是编码和画图理解。

简单工厂:## 1 背景回顾

设计模式是一种思维方式,前人总结的最佳实践,也是一种态度,一种进步。
软件过程里面设计模式一共有23种,一般分为3类。即创建型,结构性型,行为型。其中:
**创建型5种: ** 解决了创建对象的烦恼
单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式

结构性型7种: 解决了如何让类组合起来完成复杂的功能
适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式,

行为型11种: 解决了类之间的控制关系。
模版方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,状态模式,策略模式,职责链模式,访问者模式,解释器模式。

如果想要学习并掌握这些设计模式,最好是编码和画图理解。

最好是先看我前2篇,关于简单工厂工厂方法2种模式

抽象工厂:简单理解,创建工厂的工厂。

2 抽象工厂

为什么需要抽象工厂?

工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。

方便对工厂进行管理。简单工厂不满足开闭原则,工厂方方法虽然满足开闭原则,但是,不好管理这些工厂。

而抽象工厂则能站在更抽象的纬度,对这些工厂进行管理。

具体的实现:

定义2个接口,表示手机和路由器,

package com.yang.create.abstact;

//手机接口,
public interface IphoneProduct {
    void call();//打电话
    void shuntDown();//关开机
}

package com.yang.create.abstact;

//路由器接口,
public interface IrouterProduct {
    void setting();//设置密码
    void shuntDown();//关开机
    void openWifi();//打开wifi
}


然后分别增加华为手机、路由器和小米手机、路由器来实现这2个接口:

package com.yang.create.abstact;

//华为手机
public class HuaweiPhone implements IphoneProduct {
    @Override
    public void call() {
        System.out.println("华为手机打电话");
    }

    @Override
    public void shuntDown() {
        System.out.println("华为手机关机");
    }
}

package com.yang.create.abstact;
//华为路由器
public class HuaweiRouter implements IrouterProduct {

    @Override
    public void setting() {
        System.out.println("华为路由器设置密码");
    }

    @Override
    public void shuntDown() {
        System.out.println("华为路由关闭");
    }

    @Override
    public void openWifi() {
        System.out.println("华为路由openWifi");
    }
}

小米:

package com.yang.create.abstact;
//小米手机
public class XiaomiPhone implements IphoneProduct{
    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }

    @Override
    public void shuntDown() {
        System.out.println("小米手机关机");
    }


}

package com.yang.create.abstact;
//小米路由器
public class XiaomiRouter implements IrouterProduct{
    @Override
    public void setting() {
        System.out.println("小米设置密码");
    }

    @Override
    public void shuntDown() {
        System.out.println("小米关闭");
    }

    @Override
    public void openWifi() {
        System.out.println("小米openWifi");
    }
}

接下来就是最核心的了,如何实现对工厂进行管理呢?之前的我介绍的设计模式之工厂方法那篇,不能实现对工厂的管理。最直接的方法就让小米工厂和华为工厂都必须要实现这个接口才能生产出手机和路由器:

package com.yang.create.abstact;
//核心:抽象产品工厂

//只负责生产手机和路由器,而不复杂具体的类型
public interface AbstractProductFactory {
    IphoneProduct getPhone();
    IrouterProduct getRouter();
}

小米工厂:

package com.yang.create.abstact;
//小米工厂
public class XiaomiFactory  implements AbstractProductFactory{
    @Override
    public IphoneProduct getPhone() {
        return new XiaomiPhone();
    }

    @Override
    public IrouterProduct getRouter() {
        return new XiaomiRouter();
    }
}

华为工厂:

package com.yang.create.abstact;

//华为工厂
public class HuaweiFactory implements AbstractProductFactory{
    @Override
    public IphoneProduct getPhone() {
        return new HuaweiPhone();
    }

    @Override
    public IrouterProduct getRouter() {
        return new HuaweiRouter();
    }
}

消费者测试:

package com.yang.create.abstact;

public class Consumer {
    public static void main(String[] args) {
        System.out.println("==================小米产品===========");
         IphoneProduct xiaomiPhone = new XiaomiFactory().getPhone();
        IrouterProduct xiaomiRouter = new XiaomiFactory().getRouter();
        xiaomiPhone.call();
        xiaomiRouter.openWifi();

        System.out.println("==================华为产品===========");
        IphoneProduct  huaweiPhone = new HuaweiFactory().getPhone();
        IrouterProduct  huaweiRouter = new HuaweiFactory().getRouter();
        huaweiPhone.call();
        huaweiRouter.openWifi();

    }
}

测试结果:
在这里插入图片描述
这样就能实现对产品家族的管理了,而工厂模式只能实现产品的管理。

抽象工厂目录:
在这里插入图片描述

3 比较理解

  读到这里,可能还会觉得抽象工厂和工厂方法一样,都是通过具体的工厂去获取对象,本质上差别不大,请听笔者仔细道来,一起扣细节;

3.1相同点:

1 都是通过具体的工厂去获取对象

2 当增加新的产品时,抽象工厂和工厂方法都需要改动以前的代码
工厂方法:
在这里插入图片描述

抽象工厂:
在这里插入图片描述

3.2不同点:

抽象工厂站在产品家族的纬度,而工厂模式站在对单个产品的纬度。能生产手机和路由器,如果后续还想生产其他的,如笔记本,增加接口即可控制其他工厂。
抽象工厂:
在这里插入图片描述
在这里插入图片描述
在手机和路由器上

工厂方法:
只能生产一种产品,这个是由自己定义所决定的,工厂方法每种产品都必须要实现一个工厂。这会
导致存在很多工厂,如增加了笔记本,则一定会有特斯拉笔记本工厂。而抽象工厂则不用。在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值