06【工厂设计模式】_小米,华为,tcl,联想四家公司都能够生产电视、手机、冰箱三件产品,,使用抽象工厂模

package com.dfbz.demo01\_简单工厂设计模式.demo03_使用简单工厂再改进;

import java.util.Scanner;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class Demo01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入第一个数: ");
        double num1 = scanner.nextDouble();
        System.out.println("请输入第一个数: ");
        double num2 = scanner.nextDouble();

        System.out.println("请输入您要执行的运算符(+、-、\*、/): ");
        String method = scanner.next();

        Operation operation = OperationFactory.createOperation(method);

        Double result = operation.getResult(num1, num2);
        System.out.println("计算的结果集为: " + result);
    }
}

就这样,一个简单工厂设计模式就完成了。在简单工厂模式下,任何的运算逻辑新增或者修改,都不会影响客户端的代码(Demo01),只需要添加Operation的实现类,并且修改工厂类添加逻辑即可;降低了程序的耦合性;

但是,简单工厂只做到了一半的"开闭原则",因为在简单工厂中,新增了新的算法类,需要修改工厂类;如果我们需要频繁的新增一些算法则会导致频繁修改工厂类;简单工厂中,不仅对扩展开放了,对修改也开放了;

Tips:简单工厂只适合于产品对象较少,且产品固定的需求,对于产品变化无常的需求来说显然不合适;

6.1.4 简单工厂的优缺点
  • 优点:
    • 封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。
  • 缺点:
    • 1)增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。
    • 2)简单工厂模式的工厂类单一,负责所有产品的创建,但产品基数增多时,工厂类将会变得非常臃肿,违背高内聚低耦合原则;

6.2 工厂方法设计模式

工厂设计模式(Factory Method):指定一个创建对象的接口,由接口的实现类来决定实例化哪个类,工厂方法把类的实例化工作延迟到子类中进行;

在简单工厂中,随着产品链的丰富,则工厂的职责会变得越来越多,这样并不利于维护。工厂方法模式是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。

6.2.1 工厂方法的实现

工厂方法中,不仅把产品抽象出来,连工厂类也抽象出来,具体生成什么产品由子类来决定;

  • 改进后的类图如下:

在这里插入图片描述

在工厂方法中,如果要对算法进行扩展,那么就新增一个工厂并且再新增一个具体算法类即可,工厂方法完全符合了开闭原则的对扩展开发,对修改关闭的原则;

  • 工厂抽象接口:
package com.dfbz.demo02\_工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public interface IFactory {
    Operation createOperation();
}

  • 产品抽象接口:
package com.dfbz.demo02\_工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public interface Operation {
    /\*\*
 \* 负责计算两个两个数的运算结果集,到底做什么运算,交给子类
 \* @param num1
 \* @param num2
 \* @return
 \*/
    public Double getResult(Double num1,Double num2);
}

  • 专门用于生成加法产品的工厂类:
package com.dfbz.demo02\_工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class OperationAddFactory implements IFactory{
    @Override
    public Operation createOperation() {
        return new OperationAdd();
    }
}


  • 专门用于生成减法产品的工厂类:
package com.dfbz.demo02\_工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class OperationSubFactory implements IFactory{
    @Override
    public Operation createOperation() {
        return new OperationSub();
    }
}

  • 加法产品:
package com.dfbz.demo02\_工厂设计模式;


/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class OperationAdd implements Operation {
    @Override
    public Double getResult(Double num1, Double num2) {
        return num1 + num2;
    }
}

  • 减法产品:
package com.dfbz.demo02\_工厂设计模式;


/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class OperationSub implements Operation {
    @Override
    public Double getResult(Double num1, Double num2) {
        return num1 - num2;
    }
}

  • 测试类:
package com.dfbz.demo02\_工厂设计模式;


/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class Demo01 {
    public static void main(String[] args) {
        // 创建工厂
        IFactory factory=new OperationAddFactory();

        // 创建运算类
        Operation operation = factory.createOperation();

        // 做运算
        Double result = operation.getResult(20.0D, 30.0D);
    }
}

工厂方法完完全全做到了开闭原则,以后我们要新增一些算法,或者第三方厂商想要新增一些算法,那么直接进行子类扩展就行;

6.2.2 工厂方法的优缺点
  • 优点:
    • 1)职责相对于简单工厂来说,更加明确。不仅将产品类独立,还将产品工厂独立,以后修改产品工厂内部逻辑变得清晰明了;
    • 2)在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
    • 3)高层模块只需要知道产品的抽象类,无须关系其他实现类,符合迪米特法则,依赖倒转原则;
  • 缺点:
    • 1)每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,类的数量增多,这增加了系统的复杂度。
    • 2)每个工厂只能生产一种产品,该问题可以使用抽象工厂来解决。

6.3 抽象工厂设计模式

6.3.1 抽象工厂设计模式概述

在工厂方法设计模式中,工厂生产的是总是同一类的产品;例如产品1工厂只能生产产品1,产品2工厂只能生产产品2;这些工厂只生产同种类产品而抽象工厂模式将考虑多种类产品的生产。在抽象工厂中,将同一种工厂生产出来的产品称为同族产品,而同一种工厂生产出来的不同产品称为同级产品;

例如电子设备工厂能够生产手机,笔记本;旗下有小米工厂,华为工厂;小米工厂能够生产小米手机,小米笔记本;华为工厂能够生产华为手机,华为笔记本;

程序类图如下:

在这里插入图片描述

在这里插入图片描述

  • 同族产品:
    • 小米手机,小米笔记本属于同族产品,都属于小米品牌(都属于小米工厂创建的产品)
    • 华为手机,华为笔记本属于同族产品,都属于华为品牌(都属于华为工厂创建的产品)
  • 同级产品:
    • 小米手机,华为手机属于同级产品,都属于手机产品
    • 小米笔记本,华为笔记本属于同级产品,都属于笔记本产品
1)同族和同级

同族:只要是同一个工厂生产的产品都属于同族产品

在这里插入图片描述

  • 小米,小米手机,小米笔记本,小米智能机,小米老年机,小米游戏本,小米商务本等都属于小米工厂生产的产品,属于同族;

同级:工厂生产出来的产品的类别称为级别,所属同一个类别的产品,那么就是同级别产品;

在这里插入图片描述

  • 小米手机,华为手机都是属于手机,属于同级产品;
  • 小米笔记本,华为笔记本都是属于笔记本,属于同级产品;
2)同族的概念

同族是有相对概念的问题,主要看我们的程序是如何设计的

  • 关于同族:只要是同一个工厂生产的产品都属于同族产品;
  • 关于同级:工厂生产出来的产品的类别称为级别,所属同一个类别的产品,那么就是同级别产品;

例如,在下面类图中,同族与同级的关系发生了变化:

在这里插入图片描述

在这里插入图片描述

同族产品:

在这里插入图片描述

  • 小米智能机,华为智能机属于同族产品,都属于老年机厂商生产的产品
  • 小米老年机,华为老年机属于同族产品,都属于智能机厂商生产的产品

同级产品:

在这里插入图片描述

  • 小米智能机,小米老年机属于同级产品;都属于小米类别
  • 华为智能机,华为老年机属于同级产品;都属于华为类别
6.3.2 抽象工厂的实现

抽象工厂模式的主要角色如下。

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

基于类图设计程序:

在这里插入图片描述

抽象工厂:

package com.dfbz.demo03\_抽象工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro: 电子设备工厂, 用于生产电子设备
 \*/
public abstract class AbstractFactory {

    // 生产手机
    public abstract Phone createPhone();

    // 生产笔记本
    public abstract Laptop createLaptop();
}

  • 具体工厂1-小米工厂:
package com.dfbz.demo03\_抽象工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro: 小米工厂,用于生产小米的设备
 \*/
public class XiaoMiFactory extends AbstractFactory{
    @Override
    public Phone createPhone() {
        return new XiaoMiPhone();
    }

    @Override
    public Laptop createLaptop() {
        return new XiaoMiLaptop();
    }
}

  • 具体工厂2-华为工厂:
package com.dfbz.demo03\_抽象工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro: 华为工厂,用于生产华为的设备
 \*/
public class HuaWeiFactory extends AbstractFactory {
    @Override
    public Phone createPhone() {
        return new HuaWeiPhone();
    }

    @Override
    public Laptop createLaptop() {
        return new HuaWeiLaptop();
    }
}

  • 抽象产品1-手机:
package com.dfbz.demo03\_抽象工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro: 抽象产品,抽象手机,每个手机的功能是不一样的,具体的实现交给子类
 \*/
public abstract class Phone {

    public abstract void sendMsg();
}

  • 抽象产品2-笔记本:
package com.dfbz.demo03\_抽象工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro: 抽象产品,抽象笔记本,每个笔记本的功能是不一样的,具体的实现交给子类
 \*/
public abstract class Laptop {
    public abstract void play();
}

  • 具体产品1-小米手机:
package com.dfbz.demo03\_抽象工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class XiaoMiPhone extends Phone {
    @Override
    public void sendMsg() {
        System.out.println("使用小米手机发送短信....");
    }
}


  • 具体产品2-小米笔记本:
package com.dfbz.demo03\_抽象工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class XiaoMiLaptop extends Laptop {
    @Override
    public void play() {
        System.out.println("使用小米笔记本打游戏...");
    }
}


  • 具体产品3-华为手机:
package com.dfbz.demo03\_抽象工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class HuaWeiPhone extends Phone {
    @Override
    public void sendMsg() {
        System.out.println("使用华为手机发送短信....");
    }
}


  • 具体产品4-华为笔记本:
package com.dfbz.demo03\_抽象工厂设计模式;

/\*\*
 \* @author lscl
 \* @version 1.0
 \* @intro:
 \*/
public class HuaWeiLaptop extends Laptop {
    @Override
    public void play() {


### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料


网络安全面试题


![](https://img-blog.csdnimg.cn/img_convert/80674985176a4889f7bb130756893764.png)


绿盟护网行动


![](https://img-blog.csdnimg.cn/img_convert/9f3395407120bb0e1b5bf17bb6b6c743.png)


还有大家最喜欢的黑客技术


![](https://img-blog.csdnimg.cn/img_convert/5912337446dee53639406fead3d3f03c.jpeg)


**网络安全源码合集+工具包**


![](https://img-blog.csdnimg.cn/img_convert/5072ce807750c7ec721c2501c29cb7d5.png)


![](https://img-blog.csdnimg.cn/img_convert/4a5f4281817dc4613353c120c9543810.png)

**所有资料共282G**,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值