享元模式——作者ChatGPT4

660 阅读4分钟

本文正在参加「金石计划」


哈喽,大家好,我是OpenAI。

开个玩笑,今天给大家带来一篇文章基于ChatGPT4创作的文章,主要用到了下面这工具,我是不会花钱买plus的。

image.png

官网在这里

据说这是专门训练的用于编程的ChatGPT,使用起来也非常简单,即装即用,不用登录不用付费,只需cmd+k或者cmd+L向他提问就好。

而在我几天使用下来,发现他最大的用处就是学习设计模式,只需向他提问就好,下面记录我的问题和AI给出的答案:

请写一个享元模式的案例

// 定义享元接口
interface Flyweight {
    void operation();
}

// 具体享元类
class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void operation() {
        System.out.println("ConcreteFlyweight: " + intrinsicState);
    }
}

// 享元工厂类
class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        Flyweight flyweight = flyweights.get(key);
        if (flyweight == null) {
            flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
        }
        return flyweight;
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight flyweight1 = factory.getFlyweight("key1");
        Flyweight flyweight2 = factory.getFlyweight("key2");
        Flyweight flyweight3 = factory.getFlyweight("key1");

        flyweight1.operation();
        flyweight2.operation();
        flyweight3.operation();
    }
}

请解释一下

这段代码是享元模式的示例代码。

享元模式是一种结构型设计模式,它通过共享尽可能多的数据来减少内存使用和对象数量。

在这个示例中,Flyweight 接口定义了享元类的操作,ConcreteFlyweight 是具体的享元类,FlyweightFactory 是享元工厂类,用于创建和管理享元对象。客户端通过工厂类获取享元对象,并调用其操作方法。

在这个示例中,ConcreteFlyweight 对象的 intrinsicState 属性是其内部状态,而 key 参数是其外部状态。FlyweightFactory 通过 key 参数来判断是否已经创建了对应的享元对象,如果已经创建则直接返回,否则创建一个新的 ConcreteFlyweight 对象并加入到 flyweights 集合中。

这样,当客户端请求相同的 key 参数时,将返回同一个 ConcreteFlyweight 对象,从而实现了对象的共享。

如何保证享元对象的内部状态不可变

为了保证享元对象的内部状态不可变,可以将内部状态声明为 final 类型,并在构造函数中进行初始化。这样一来,内部状态就不能被修改了。

例如,在 ConcreteFlyweight 类中,可以将 intrinsicState 声明为 final 类型,并在构造函数中进行初始化,如下所示:

class ConcreteFlyweight implements Flyweight {
    private final String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void operation() {
        System.out.println("ConcreteFlyweight: " + intrinsicState);
    }
}

这样一来,intrinsicState 就不能被修改了。

享元模式和工厂模式有什么区别

享元模式和工厂模式都是创建型模式,它们的主要区别在于它们的目的不同。

工厂模式的主要目的是封装对象的创建过程,将对象的创建和使用分离开来,从而提高系统的灵活性和可维护性。

而享元模式的主要目的是尽可能地减少系统中对象的数量,从而提高系统的性能和效率。在享元模式中,对象的创建是一个比较昂贵的操作,因此我们希望尽可能地减少对象的创建次数,通过共享已有的对象来达到这个目的。

因此,享元模式通常会结合工厂模式一起使用,通过享元工厂来管理和共享对象。

总结

上午和朋友讨论了好久AI的问题,我的看法是AI只是工具,即使他升级甚至颠覆了传统搜索引擎,人也不会被替代,无论是理科还是文科专业:

  • 没一个公司会随便找来一个人写代码,不会去网上查呗,公司是需要效率的,这是其一。第二是因为真实的企业开发中技术是要建立业务之上的,而业务短期来看AI无法解决,即使能解决,如何准确的描述出来也是个问题。
  • 文科就更简单了,无论是文章还是文案,流水线产品注定会被淘汰,一个好的作品必要是带有作者强烈的个人色彩的,这点我觉得AI还有很远很远很远的路要走。

说回本文,AI也不是完全没有用处,目前来看,用来学习一些琐碎的知识点很有帮助,他就像你的私人教师,回答你的一个又一个问题,带着你思考。

本文只是个案例,大家可以下载下来体验一下。

我们下期再见!我是一条。