软考77-上午题-【面向对象技术3-设计模式】-创建型设计模式02

本文介绍了Java中的三种设计模式:生成器模式(Builder/Director/ConcreteBuilder)用于创建复杂对象的不同表示,原型模式用于基于原型实例创建对象,单例模式确保类只有一个实例。这些模式在软件开发中常用于解耦、复用和控制对象实例数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、生成器模式

1-1、意图

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

1-2、结构图

  • Builder 为创建一个 Product 对象的各个部件指定抽象接口。
  • ConcreteBuilder 实现 Builder 的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。
  • Director 构造一个使用 Builder 接口的对象。
  • Product 表示被构造的复杂对象。
  • ConcreteBuilder 创建该产品的内部表示并定义它的装配过程。包含定义组成组件的类,包括将这些组件装配成最终产品的接口。

1-3、代码表示

1-4、适用性

创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

当构造过程必须允许被构造的对象有不同的表示时。

1-5、真题

真题1:

真题2:

真题3:

二、原型模式

上午题没怎么考过,考下午题。

2-1、意图

用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

2-2、结构图

  • Prototype 声明一个复制自身的接口。
  • ConcretePrototype 实现一个复制自身的操作。
  • Client 让一个原型复制自身从而创建一个新的对象。

2-3、代码表示

抽象原型:

interface ProtoType {
    public Object Clone();
}

具体原型:

package Design23;

public class Product implements ProtoType{
    private int id;
    private double price;

    public Product(){}

    public Product(int id, double price){
        this.id = id;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public Object Clone() {
        Product product = new Product();
        product.id = this.id;
        product.price = this.price;

        return product;
    }
}

客户端:

java中已经提供了一个克隆的接口:

package Design23;

public class Product implements Cloneable{
    private int id;
    private double price;

    public Product(){}

    public Product(int id, double price){
        this.id = id;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

【注意】:

能被clone的类,要实现Cloneable接口!

 

2-4、适用性

  • 当一个系统应该独立于它的产品创建、构成和表示时。
  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载
  • 为了避免创建一个与产品类层次平行的工厂类层次时。
  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。

【对比】:抽象工厂

三、单例模式 

只考上午题

3-1、意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

3-2、结构图

3-3、代码实现

package Design23;

public class Singleton {

    private int number = 2024;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    // 创建一个唯一的实例
    static Singleton instance = new Singleton();

    // public Singleton(){}
    private Singleton(){}

    // 访问它的全局访问点
    public static Singleton getInstance(){
        return instance;
    }

}
public class SingletonMain {

    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();

        System.out.println(singleton1.getNumber() + " " + singleton2.getNumber());

        singleton1.setNumber(22);
        System.out.println(singleton1.getNumber() + " " + singleton2.getNumber());
    }

}

3-4、适用性

类只能有一个实例而且客户可以从众所周知的访问点访问它时。

当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。

3-5、真题

真题1:

真题2:

真题3:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值