• Java设计模式 _创建型模式_工厂模式(普通工厂和抽象工厂)


    一、工厂模式

    属于Java设计模式创建者模式的一种。在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

    二、代码示例

    场景:花店有不同的花,通过工厂模式来获取花。

    1、普通工厂模式
    逻辑步骤:
    (1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
    (2)、创建规范的工厂类,封装创建实体对象的方法,只需要根据提供的基础信息就能区别出需要返回的实体对象。
    (3)、创建工厂的示例,使用工厂的创建方法创建需要的对象。

    逻辑关系:
    在这里插入图片描述

    代码示例:

    // 定义花的抽象接口,每一种花都要遵循此规范
    public interface Flower {
        // 描述花的信息
        String desc();
    }
    // 实现类1,玫瑰花
    public class Rose implements Flower {
        @Override
        public String desc() {
            return "玫瑰花";
        }
    }
    // 实现类2,牡丹花
    public class Peony implements Flower {
        @Override
        public String desc() {
            return "牡丹花";
        }
    }
    // 定义花的创建工厂类
    public class FlowerFactory {
    	// 根据花的名称返回创建对象
        public Flower createFlower(String message){
            if ("玫瑰".equals(message)){
                return new Rose();
            } else {
                return new Peony();
            }
        }
    }
    // 测试类
    public class ZTest {
        public static void main(String[] args) {
            FlowerFactory flowerFactory = new FlowerFactory();
            Flower flower = flowerFactory.createFlower("玫瑰");
            System.out.println(flower.desc());
    
            flower = flowerFactory.createFlower("牡丹");
            System.out.println(flower.desc());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    运行结果:
    在这里插入图片描述
    由运行结果看到,只要对工厂类提供基础的信息描述文字,就能得到对应的花的实体对象。
    总结:
    仅定义一个工厂用于创建所有可能的实例,根据描述信息创建对应的实例(相当于知道的花的名称,然后去找花店得到花)。

    2、抽象工厂示例
    逻辑步骤:
    (1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
    (2)、创建抽象的规范工厂(抽象类),定义统一的创建方法(抽象方法)
    (3)、创建每一种实体的工厂类,实现规范工厂的抽象方法用来创建对应的实例对象
    (4)、定义抽象工厂,不同场景下构建不同的实例工厂来创建对象

    逻辑关系:
    在这里插入图片描述
    代码示例:

    // 定义花的抽象接口,每一种花都要遵循此规范
    public interface Flower {
        // 描述花的信息
        String desc();
    }
    // 实现类1,玫瑰花
    public class Rose implements Flower {
        @Override
        public String desc() {
            return "玫瑰花";
        }
    }
    // 实现类2,牡丹花
    public class Peony implements Flower {
        @Override
        public String desc() {
            return "牡丹花";
        }
    }
    
    // 定义抽象工厂和抽象创建方法
    public abstract class FlowerFactory {
        abstract Flower createFlower();
    }
    // 定义玫瑰的实例工厂,实现抽象工厂
    public class RoseFactory extends FlowerFactory {
         public Flower createFlower(){
             return new Rose();
         };
    }
    // 定义牡丹的实例工厂,实现抽象工厂
    public class PeonyFactory extends FlowerFactory {
         public Flower createFlower(){
             return new Peony();
         };
    }
    // 测试方法
    public class ZTest {
        public static void main(String[] args) {
            FlowerFactory flowerFactory = new RoseFactory();
            Flower flower = flowerFactory.createFlower();
            System.out.println(flower.desc());
    
            flowerFactory = new PeonyFactory();
            flower = flowerFactory.createFlower();
            System.out.println(flower.desc());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    运行结果
    在这里插入图片描述
    总结:
    需要定义一个抽象工厂,和每一种花的实例工厂用于创建自身的实例(相当于知道了花店的地址,这个花店只卖这一种花的情况)。

    三、普通工厂和抽象工厂对比

    两种方法都实现了封装创建实例的功能。
    但是普通工厂模式违反了单一职责的原则(一个类只干一种事情),且随着花的实例品种越来越多,每一次都要修改工厂类才能添加新的花品种,相对而言是改动是比较大的也比较麻烦的。
    抽象工厂模式,很好的规避了普通工厂的这两个缺点,新增花的品种,只要添加新的花品种的工厂类即可,但是这种方式会造成有非常多的类需要维护,不方便于代码的管理和维护。
    总结来说,工厂模式和抽象工厂模式都有其独特的优点和适用场景。工厂模式适用于创建单个对象的情况,而抽象工厂模式适用于创建一系列相关的产品对象。在选择使用哪种模式时,应根据具体的业务需求和系统架构进行权衡和选择。

    学海无涯苦作舟!!!

  • 相关阅读:
    SQL教程之性能不仅仅是查询
    用Dotfuscator混淆.Net的WebService应用
    艾美捷Cas9核酸酶应用说明及实例展示
    serveless 思想 Midway.js 框架使用教程(一)
    PyQt5(一) PyQt5安装及配置,从文件夹读取图片并显示,模拟生成素描图像
    [机缘参悟-77]:深度思考-《天道》中强势文化、弱势文化与人的行为模式的关系
    从零开始打造一款基于SpringBoot+SpringCloud的后台权限管理系统
    python分析inkscape路径数据的简单方案
    立晶半导体Cubic Lattice Inc 专攻音频ADC,音频DAC,音频CODEC,音频CLASS D等CL7016
    为什么高精度机器人普遍使用谐波减速器而不是普通减速器?
  • 原文地址:https://blog.csdn.net/qq_34207422/article/details/138197957