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

发布于:2024-04-29 ⋅ 阅读:(202) ⋅ 点赞:(0)

一、工厂模式

属于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());
    }
}

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

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());
    }
}

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

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

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

学海无涯苦作舟!!!


网站公告

今日签到

点亮在社区的每一天
去签到