设计模式-工厂方法&原型&模板方法&外观

举报
yd_294916736 发表于 2026/11/04 00:12:52 2026/11/04
【摘要】 设计模式-工厂方法&原型&模板方法&外观

设计模式概述 - 工厂方法 & 原型 & 模板方法 & 外观

工厂方法模式简述

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法将类的实例化推迟到子类。

角色

  • 产品接口(Product):定义产品的接口。
  • 具体产品(ConcreteProduct):实现产品接口的具体类。
  • 工厂接口(Creator):定义创建产品的工厂方法。
  • 具体工厂(ConcreteCreator):实现工厂接口,返回具体产品的实例。

优点

  • 解耦:客户端不需要知道具体产品的类,只需依赖于产品接口。
  • 扩展性:增加新产品时只需新增具体产品和具体工厂,而不需要修改已有代码。

缺点

  • 类的数量增加:每增加一种产品,就需要增加一个具体产品和一个具体工厂,可能导致类的数量增加。
  • 复杂性:对于简单的场景,使用工厂方法模式可能显得过于复杂。

示例代码

// 产品接口
interface Product {
    void use();
}

// 具体产品A
class ConcreteProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using ConcreteProductA.");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using ConcreteProductB.");
    }
}

// 工厂接口
abstract class Creator {
    public abstract Product factoryMethod();
}

// 具体工厂A
class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

// 具体工厂B
class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Creator creatorA = new ConcreteCreatorA();
        Product productA = creatorA.factoryMethod();
        productA.use();

        Creator creatorB = new ConcreteCreatorB();
        Product productB = creatorB.factoryMethod();
        productB.use();
    }
}

原型模式简述

原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有的实例来创建新对象,而不是通过实例化一个新的对象。这种模式适用于创建相似对象的场景,尤其是在创建对象的成本较高时。

角色

  • 原型接口(Prototype):定义克隆方法。
  • 具体原型(ConcretePrototype):实现原型接口,提供具体的克隆方法。
  • 客户端(Client):使用原型对象来创建新的对象。

优点

  • 性能提升:通过复制现有对象来创建新对象,避免了重复的初始化过程。
  • 简化创建过程:可以通过克隆现有对象来简化对象的创建过程。

缺点

  • 复杂性:实现克隆方法可能会增加代码的复杂性,尤其是在对象包含复杂的成员时。
  • 深拷贝与浅拷贝:需要关注对象的拷贝方式,深拷贝和浅拷贝的选择可能会影响对象的状态。

示例代码

// 原型接口
interface Prototype {
    Prototype clone();
}

// 具体原型
class ConcretePrototype implements Prototype {
    private String name;

    public ConcretePrototype(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public Prototype clone() {
        return new ConcretePrototype(this.name);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        ConcretePrototype original = new ConcretePrototype("Original");
        ConcretePrototype clone = (ConcretePrototype) original.clone();

        System.out.println("Original Name: " + original.getName());
        System.out.println("Cloned Name: " + clone.getName());
    }
}

模板方法模式简述

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,并允许子类在不改变算法结构的情况下重新定义某些特定步骤。通过这种方式,模板方法模式可以实现代码复用和算法的灵活性。

角色

  • 抽象类(AbstractClass):定义模板方法和一些基本操作的接口。
  • 具体类(ConcreteClass):实现抽象类中的某些操作,完成特定的算法步骤。

优点

  • 代码复用:通过将算法的公共部分放在抽象类中,减少了代码重复。
  • 灵活性:子类可以根据需要重写某些步骤,灵活定制算法的具体实现。

缺点

  • 增加复杂性:模板方法模式可能会导致类的数量增加,从而增加系统的复杂性。
  • 限制扩展:子类只能重写抽象类中定义的方法,可能会限制某些灵活性。

示例代码

// 抽象类
abstract class AbstractClass {
    // 模板方法
    public final void templateMethod() {
        stepOne();
        stepTwo();
        stepThree();
    }

    // 基本方法
    protected abstract void stepOne();
    protected abstract void stepTwo();

    // 钩子方法
    protected void stepThree() {
        System.out.println("Default Step Three Implementation.");
    }
}

// 具体类A
class ConcreteClassA extends AbstractClass {
    @Override
    protected void stepOne() {
        System.out.println("ConcreteClassA: Step One Implementation.");
    }

    @Override
    protected void stepTwo() {
        System.out.println("ConcreteClassA: Step Two Implementation.");
    }
}

// 具体类B
class ConcreteClassB extends AbstractClass {
    @Override
    protected void stepOne() {
        System.out.println("ConcreteClassB: Step One Implementation.");
    }

    @Override
    protected void stepTwo() {
        System.out.println("ConcreteClassB: Step Two Implementation.");
    }

    @Override
    protected void stepThree() {
        System.out.println("ConcreteClassB: Custom Step Three Implementation.");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        AbstractClass classA = new ConcreteClassA();
        classA.templateMethod();

        System.out.println();

        AbstractClass classB = new ConcreteClassB();
        classB.templateMethod();
    }
}

外观模式简述

外观模式(Facade Pattern)是一种结构型设计模式,它为复杂的子系统提供一个统一的接口,使得子系统更易使用。通过外观模式,客户端可以通过一个简单的接口与复杂的系统进行交互,从而降低系统的复杂性。

角色

  • 外观类(Facade):提供一个简单的接口,封装了复杂的子系统。
  • 子系统类(Subsystem):实现具体的功能,通常由多个类组成。

优点

  • 简化接口:通过提供统一的接口,简化了子系统的使用。
  • 降低耦合:客户端与子系统之间的依赖关系减少,提高了系统的可维护性。
  • 提高可读性:外观模式使得代码的结构更加清晰,易于理解。

缺点

  • 可能导致功能膨胀:外观类可能会变得过于复杂,承担过多的责任。
  • 不符合开放-封闭原则:如果子系统发生变化,可能需要修改外观类的实现。

示例代码

// 子系统类A
class SubsystemA {
    public void operationA() {
        System.out.println("SubsystemA: Operation A");
    }
}

// 子系统类B
class SubsystemB {
    public void operationB() {
        System.out.println("SubsystemB: Operation B");
    }
}

// 子系统类C
class SubsystemC {
    public void operationC() {
        System.out.println("SubsystemC: Operation C");
    }
}

// 外观类
class Facade {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
    private SubsystemC subsystemC;

    public Facade() {
        subsystemA = new SubsystemA();
        subsystemB = new SubsystemB();
        subsystemC = new SubsystemC();
    }

    public void simpleOperation() {
        subsystemA.operationA();
        subsystemB.operationB();
        subsystemC.operationC();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.simpleOperation();
    }
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。