• 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

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

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

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

    学海无涯苦作舟!!!

  • 相关阅读:
    Java注解
    数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界
    JUC第十五讲:JUC集合-ConcurrentHashMap详解(面试的重点)
    Java-基于SSM的智能仓储管理系统
    数说故事再获IDC认可,入选“数据智能决策”热点技术代表企业
    linux安装oracle client解决cx_Oracle.DatabaseError: DPI-1047
    linux udp 广播recvfrom 返回 -1 错误码是 11 EAGAIN Resource temporarily unavailable
    java ThreadPoolExecutor怎么设置队列不满也能达到最大线程池大小
    叶绿素含量测定仪SPAD-502怎么使用?
    Pandas数据分析15——pandas数据透视表和交叉表
  • 原文地址:https://blog.csdn.net/qq_34207422/article/details/138197957