设计模式-创建型设计模式

1.创建型设计模式

1.1 简单工厂模式


存在的问题:不符合开闭原则(对修改关闭对扩展开放)

代码:

java 复制代码
// 包声明,定义当前类所在的包路径
package patterns.A简单工厂模式;

/**
 * 简单工厂模式演示类
 * 简单工厂模式:根据传入的参数决定创建哪种类型的产品对象
 * 优点:客户端不需要知道具体产品的创建过程,只需要传入类型参数
 * 缺点:工厂类职责过重,违反开闭原则(添加新产品需要修改工厂类)
 */
public class SimpleFactory {
    /**
     * 程序入口点
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 通过工厂类创建类型为"A"的产品对象
        Product productA = Factory.createProduct("A");
        // 调用产品A的info方法,输出产品信息
        productA.info();

        // 通过工厂类创建类型为"B"的产品对象
        Product productB = Factory.createProduct("B");
        // 注意:这里没有调用productB.info(),所以不会输出产品B的信息
    }
}

/**
 * 抽象产品类
 * 定义了产品的通用接口和基本功能
 * 抽象类的特点:
 * 1.可以写抽象方法(必须被子类实现)
 * 2.也可以写私有方法(只能在本类中使用)
 * 3.也可以写带有方法体的方法(可以有具体实现)
 */
abstract class Product {
    /**
     * 抽象方法:显示产品信息
     * 所有具体产品类都必须实现这个方法
     */
    public abstract void info();//产品信息

    /**
     * 私有方法:输出产品名称
     * @param name 产品名称
     * 注意:这是私有方法,只能在Product类内部调用
     */
    private void name(String name) {
        System.out.println(name);
    }
}

/**
 * 工厂类
 * 负责根据传入的类型参数创建对应的产品对象
 * 这是简单工厂模式的核心类
 */
class Factory {
    /**
     * 静态工厂方法:根据产品类型创建对应的产品对象
     * 注意:静态方法-类名.静态方法(可以直接被外界调用,创建所需对象)
     * @param type 产品类型("A"或"B")-Product
     * @return 对应的产品对象,如果类型不存在则返回null
     */
    public static Product createProduct(String type) {
        // 声明产品对象变量,初始化为null
        Product product = null;

        // 使用switch语句根据类型参数决定创建哪种产品(也可以用if)
        switch (type) {
            case "A":
                // 创建产品A的实例
                product = new ProductA();
                break;
            case "B":
                // 创建产品B的实例
                product = new ProductB();
                break;
            default:
                // 如果传入的类型不是"A"或"B",输出错误信息
                System.out.println("没有 " + type + " 类型的产品!");
                break;
        }

        // 返回创建的产品对象(如果类型不存在则返回null)
        return product;
    }
}

/**
 * 具体产品A类
 * 继承自抽象产品类Product,实现具体的产品A功能
 */
class ProductA extends Product {

    /**
     * 重写父类的抽象方法info()
     * 实现产品A特有的信息显示功能
     */
    @Override
    public void info() {
        // 输出产品A的信息
        System.out.println("产品的信息:A");
    }
}

/**
 * 具体产品B类
 * 继承自抽象产品类Product,实现具体的产品B功能
 */
class ProductB extends Product {

    /**
     * 重写父类的抽象方法info()
     * 实现产品B特有的信息显示功能
     */
    @Override
    public void info() {
        // 输出产品B的信息
        System.out.println("产品的信息:B");
    }
}

1.2 工厂方法

java 复制代码
// 包声明,定义当前类所在的包路径
package patterns.B工厂方法模式;

/**
 * 工厂方法模式演示类
 * 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类
 * 优点:符合开闭原则,添加新产品时只需要添加新的工厂类,不需要修改现有代码
 * 缺点:类的数量增加,系统复杂度提高
 * 与简单工厂模式的区别:工厂方法模式将工厂抽象化,每个具体工厂只负责创建一种产品
 */
public class FactoryMethod {
    /**
     * 程序入口点
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 创建具体工厂A的实例,使用多态:父类引用指向子类对象
        Factory factoryA = new FactoryA();
        // 父类 对象名 = new 子类(); 这是多态的基本用法

        // 通过工厂A创建产品A对象
        Product productA = factoryA.createProduct();
        // 注释掉的代码:直接创建产品对象,不符合工厂方法模式的设计原则
        // Product productA = new ProductA();
        // 调用产品A的info方法,输出产品信息
        productA.info();

        // 创建具体工厂B的实例
        Factory factoryB = new FactoryB();

        // 通过工厂B创建产品B对象
        Product productB = factoryB.createProduct();
        // 调用产品B的info方法,输出产品信息
        productB.info();
    }
}

/**
 * 抽象工厂接口
 * 定义创建产品的抽象方法,由具体工厂类实现
 * 工厂方法模式的核心:将工厂抽象化,每个具体工厂负责创建一种产品
 */
interface Factory {
    /**
     * 抽象工厂方法:创建产品对象
     * @return 创建的产品对象
     */
    public Product createProduct();
}

/**
 * 具体工厂A类
 * 实现抽象工厂接口,专门负责创建产品A
 * 每个具体工厂只负责创建一种产品,符合单一职责原则
 */
class FactoryA implements Factory {

    /**
     * 实现抽象工厂方法,创建产品A的实例
     * @return 产品A的实例
     */
    @Override
    public Product createProduct() {
        // 返回产品A的具体实例
        return new ProductA();
    }
}

/**
 * 具体工厂B类
 * 实现抽象工厂接口,专门负责创建产品B
 * 每个具体工厂只负责创建一种产品,符合单一职责原则
 */
class FactoryB implements Factory {

    /**
     * 实现抽象工厂方法,创建产品B的实例
     * @return 产品B的实例
     */
    @Override
    public Product createProduct() {
        // 返回产品B的具体实例
        return new ProductB();
    }
}

/**
 * 抽象产品接口
 * 定义产品的通用接口,所有具体产品都必须实现这个接口
 * 使用接口而不是抽象类,因为接口更灵活,支持多重实现
 */
interface Product {
    // 注释掉的代码:在接口中,方法默认是public abstract的
    // public abstract void info();
    /**
     * 抽象方法:显示产品信息
     * 接口中的方法默认是public abstract的,可以省略这些修饰符
     */
    public void info();
}

/**
 * 具体产品A类
 * 实现implements抽象产品接口,提供产品A的具体实现
 * 每个具体产品类实现一种产品的具体功能
 */
class ProductA implements Product {


    @Override
    public void info() {
        System.out.println("产品的信息: A");
    }
}

/**
 * 具体产品B类
 * 实现implements抽象产品接口,提供产品B的具体实现
 * 每个具体产品类实现一种产品的具体功能
 */
class ProductB implements Product {

    /**
     * 实现抽象方法info()
     * 输出产品B的具体信息
     */
    @Override
    public void info() {
        // 输出产品B的信息
        System.out.println("产品的信息:B");
    }
}

补充官方资料:

1.3 抽象工厂


java 复制代码
// 包声明,定义当前类所在的包路径
package patterns.C抽象工厂模式;

/**
 * 抽象工厂模式演示类
 * 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
 * 优点:能够保证创建的对象属于同一个产品族,符合开闭原则
 * 缺点:难以扩展新的产品种类,需要修改抽象工厂接口
 * 适用场景:需要创建多个产品族,且每个产品族有多个产品等级结构
 * 与工厂方法模式的区别:抽象工厂模式创建的是产品族,工厂方法模式创建的是单个产品
 */
public class AbstractFactory {
    /**
     * 程序入口点
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 创建具体工厂1的实例,该工厂可以创建产品族1的所有产品
        Factory factory1 = new Factory1();

        // 通过工厂1创建产品A1(属于产品族1)
        ProductA productA = factory1.createProductA();
        // 调用产品A1的info方法,输出产品信息
        productA.info();

        // 创建具体工厂2的实例,该工厂可以创建产品族2的所有产品
        Factory factory2 = new Factory2();

        // 通过工厂2创建产品B2(属于产品族2)
        ProductB productB = factory2.createProductB();
        // 调用产品B2的info方法,输出产品信息
        productB.info();
    }
}

/**
 * 抽象工厂接口
 * 定义创建一系列相关产品的抽象方法
 * 每个具体工厂实现这个接口,负责创建属于同一产品族的所有产品
 * 抽象工厂模式的核心:一个工厂可以创建多种不同类型但相关的产品
 */
interface Factory {
    /**
     * 抽象方法:创建产品A
     * @return 产品A的实例
     */
    public ProductA createProductA();

    /**
     * 抽象方法:创建产品B
     * @return 产品B的实例
     */
    public ProductB createProductB();
}

/**
 * 具体工厂1类
 * 实现抽象工厂接口,专门负责创建产品族1的所有产品
 * 产品族1包括:ProductA1和ProductB1
 * 每个具体工厂负责创建一个完整的产品族
 */
class Factory1 implements Factory {

    /**
     * 实现抽象方法,创建产品族1中的产品A1
     * @return 产品A1的实例
     */
    @Override
    public ProductA createProductA() {
        // 返回产品族1中的产品A1
        return new ProductA1();
    }

    /**
     * 实现抽象方法,创建产品族1中的产品B1
     * @return 产品B1的实例
     */
    @Override
    public ProductB createProductB() {
        // 返回产品族1中的产品B1
        return new ProductB1();
    }
}

/**
 * 具体工厂2类
 * 实现抽象工厂接口,专门负责创建产品族2的所有产品
 * 产品族2包括:ProductA2和ProductB2
 * 每个具体工厂负责创建一个完整的产品族
 */
class Factory2 implements Factory {

    /**
     * 实现抽象方法,创建产品族2中的产品A2
     * @return 产品A2的实例
     */
    @Override
    public ProductA createProductA() {
        // 返回产品族2中的产品A2
        return new ProductA2();
    }

    /**
     * 实现抽象方法,创建产品族2中的产品B2
     * @return 产品B2的实例
     */
    @Override
    public ProductB createProductB() {
        // 返回产品族2中的产品B2
        return new ProductB2();
    }
}

/**
 * 抽象产品A接口
 * 定义产品A的通用接口,所有具体产品A都必须实现这个接口
 * 产品A是产品族中的一个产品等级
 */
interface ProductA {
    /**
     * 抽象方法:显示产品信息
     * 所有具体产品A都必须实现这个方法
     */
    public void info();
}

/**
 * 具体产品A1类
 * 实现抽象产品A接口,属于产品族1
 * 产品族1中的产品A1的具体实现
 */
class ProductA1 implements ProductA {

    /**
     * 实现抽象方法info()
     * 输出产品A1的具体信息
     */
    @Override
    public void info() {
        // 输出产品族1中产品A1的信息
        System.out.println("产品的信息:A1");
    }
}

/**
 * 具体产品A2类
 * 实现抽象产品A接口,属于产品族2
 * 产品族2中的产品A2的具体实现
 */
class ProductA2 implements ProductA {

    /**
     * 实现抽象方法info()
     * 输出产品A2的具体信息
     */
    @Override
    public void info() {
        // 输出产品族2中产品A2的信息
        System.out.println("产品的信息:A2");
    }
}

/**
 * 抽象产品B接口
 * 定义产品B的通用接口,所有具体产品B都必须实现这个接口
 * 产品B是产品族中的另一个产品等级
 */
interface ProductB {
    /**
     * 抽象方法:显示产品信息
     * 所有具体产品B都必须实现这个方法
     */
    public void info();
}

/**
 * 具体产品B1类
 * 实现抽象产品B接口,属于产品族1
 * 产品族1中的产品B1的具体实现
 */
class ProductB1 implements ProductB {

    /**
     * 实现抽象方法info()
     * 输出产品B1的具体信息
     */
    @Override
    public void info() {
        // 输出产品族1中产品B1的信息
        System.out.println("产品的信息:B1");
    }
}

/**
 * 具体产品B2类
 * 实现抽象产品B接口,属于产品族2
 * 产品族2中的产品B2的具体实现
 */
class ProductB2 implements ProductB {

    /**
     * 实现抽象方法info()
     * 输出产品B2的具体信息
     */
    @Override
    public void info() {
        // 输出产品族2中产品B2的信息
        System.out.println("产品的信息:B2");
    }
}

1.4 生成器模式

java 复制代码
package patterns.C生成器模式;

import java.util.*;

/**
 * 建造者模式(Builder Pattern)示例
 * 
 * 建造者模式是一种创建型设计模式,它允许你分步骤创建复杂对象。
 * 该模式让你使用相同的创建代码生成不同类型和形式的对象。
 * 
 * 主要组成部分:
 * 1. Director(指挥者):负责调用建造者来构建产品
 * 2. Builder(建造者抽象类):定义构建产品的接口
 * 3. ConcreteBuilder(具体建造者):实现具体的构建过程
 * 4. Product(产品):最终构建的复杂对象
 */
public class Main {
    public static void main(String[] args) {
        // 创建指挥者对象,负责协调建造过程
        Director director = new Director();

        // 使用Builder1构建第一个产品
        Builder builder1 = new Builder1();
        director.Construct(builder1);  // 指挥者调用建造者构建产品
        Product product1 = builder1.getResult();  // 获取构建完成的产品
        product1.show();  // 展示产品组成

        System.out.println("-------------------");

        // 使用Builder2构建第二个产品
        Builder builder2 = new Builder2();
        director.Construct(builder2);  // 指挥者调用建造者构建产品
        Product product2 = builder2.getResult();  // 获取构建完成的产品
        product2.show();  // 展示产品组成
    }
}

/**
 * Director(指挥者)类
 * 
 * 指挥者负责定义构建产品的步骤顺序,它知道如何调用建造者来构建产品。
 * 指挥者不直接创建产品,而是通过调用建造者的方法来构建产品。
 * 这样可以确保产品的构建过程是一致的,同时允许不同的建造者创建不同的产品。
 */
class Director {
    /**
     * 构建产品的方法
     * @param builder 具体的建造者对象
     */
    public void Construct(Builder builder) {
        // 调用建造者的构建方法来构建产品的各个部分
        builder.BuildPart();
    }
}

/**
 * Builder(建造者)抽象类
 * 
 * 定义了构建产品的抽象接口,包含两个主要方法:
 * 1. BuildPart() - 构建产品的各个部分
 * 2. getResult() - 返回构建完成的产品
 * 
 * 不同的具体建造者可以有不同的构建实现,从而创建不同配置的产品。
 */
abstract class Builder {
    /**
     * 构建产品各个部分的抽象方法
     * 具体的建造者需要实现这个方法,定义如何构建产品的各个组件
     */
    public abstract void BuildPart();//产品的零件

    /**
     * 获取构建完成的产品
     * @return 构建完成的产品对象
     */
    public abstract Product getResult();
}

/**
 * Builder1(具体建造者1)类
 * 
 * 实现了Builder抽象类,定义了第一种产品的构建方式。
 * 这个建造者会构建一个包含6个组件(A、B、C、D、E、F)的完整产品。
 */
class Builder1 extends Builder {
    // 正在构建的产品对象
    Product product = new Product();

    /**
     * 构建产品的各个部分
     * Builder1会添加6个组件:A、B、C、D、E、F
     */
    @Override
    public void BuildPart() {
        product.Add("A");  // 添加组件A
        product.Add("B");  // 添加组件B
        product.Add("C");  // 添加组件C
        product.Add("D");  // 添加组件D
        product.Add("E");  // 添加组件E
        product.Add("F");  // 添加组件F
    }

    /**
     * 返回构建完成的产品
     * @return 包含6个组件的完整产品
     */
    @Override
    public Product getResult() {
        return product;
    }
}

/**
 * Builder2(具体建造者2)类
 * 
 * 实现了Builder抽象类,定义了第二种产品的构建方式。
 * 这个建造者会构建一个包含3个组件(A、B、C)的简化产品。
 * 与Builder1相比,这是一个更简单的产品配置。
 */
class Builder2 extends Builder {
    // 正在构建的产品对象
    Product product = new Product();

    /**
     * 构建产品的各个部分
     * Builder2会添加3个组件:A、B、C(简化版本)
     */
    @Override
    public void BuildPart() {
        product.Add("A");  // 添加组件A
        product.Add("B");  // 添加组件B
        product.Add("C");  // 添加组件C
    }

    /**
     * 返回构建完成的产品
     * @return 包含3个组件的简化产品
     */
    @Override
    public Product getResult() {
        return product;
    }
}

/**
 * Product(产品)类
 * 
 * 表示最终构建的复杂对象。在这个例子中,产品由多个组件组成。
 * 产品类提供了添加组件和展示产品组成的功能。
 * 
 * 建造者模式的优势:
 * 1. 可以分步骤构建复杂对象
 * 2. 可以使用相同的构建代码生成不同的产品
 * 3. 将构建过程与表示分离
 * 4. 便于扩展新的产品类型
 */
class Product {
    // 存储产品组件的列表
    List<String> parts = new ArrayList<String>();

    /**
     * 向产品中添加一个组件
     * @param part 要添加的组件名称
     */
    public void Add(String part) {
        parts.add(part);
    }

    /**
     * 展示产品的组成
     * 输出产品包含的所有组件
     */
    public void show() {
        System.out.print("产品的组成:");
        // 遍历所有组件并输出
        for (String s : parts)
            System.out.print(s + " ");

        System.out.print("\n");  // 换行
    }
}
相关推荐
CoderCodingNo3 小时前
【GESP】C++四级真题 luogu-B4040 [GESP202409 四级] 黑白方块
开发语言·c++
桦说编程3 小时前
CompletableFuture API 过于复杂?选取7个最常用的方法,解决95%的问题
java·后端·函数式编程
数智顾问3 小时前
Flink ProcessFunction 与低层级 Join 实战手册:多流广告计费精确去重
java·spring boot·spring
小火柴1233 小时前
利用R绘制条形图
开发语言·r语言
一头生产的驴4 小时前
java整合itext pdf实现固定模版pdf导出
java·python·pdf
魔都吴所谓4 小时前
【python】快速实现pdf批量去除指定位置水印
java·python·pdf
Camel卡蒙4 小时前
数据结构——字典树Trie(介绍、Java实现)
java·数据结构
kida_yuan4 小时前
【Java】基于 Tabula 的 PDF 合并单元格内容提取
java·数据分析
沐知全栈开发4 小时前
PHP MySQL 插入数据详解
开发语言