首页 > 其他分享 >跟着ChatGPT学习设计模式 - 工厂模式

跟着ChatGPT学习设计模式 - 工厂模式

时间:2024-07-23 21:51:50浏览次数:7  
标签:需要 创建 玩具 工厂 接口 ChatGPT 设计模式 public

1. 前言

在工作过程中,越发觉得设计模式的重要性。经常会有人说工作5年的人,大学生随便培训1-2月也能做同样的工作,没错,大学生的确可以做。

但其写的代码,可维护性、可扩展性、添加新功能时方便还是简单。甚至是软实力的表现,如何沟通、如何推进项目进展、如何做项目排期,其实都是应届生所不具备的。(当然工作5年的人和大学生没不一样的,那你就应该被社会所淘汰,不裁你,裁谁呢)

大家不需要趾高气昂,但也不必要妄自菲薄。

针对此,我出了 《跟着ChatGPT学习设计模式》系列,欢迎大家点赞收藏转发,今天我们学习工厂模式。包括:简单工厂模式、工厂模式、抽象工厂模式

2. 简单工厂模式

Q: 请你详细解释一下 简单设计工厂模式,回答要简洁,让小朋友也能听懂那种

什么是简单工厂模式?

简单工厂模式是一种设计模式,它通过一个专门的类来负责创建其他类的实例。这个专门的类通常被称为“工厂类”。简单工厂模式的主要目的是将对象的创建过程封装起来,使得客户端代码不需要知道具体的创建细节。

为什么需要简单工厂模式?

  1. 简化对象创建:客户端代码不需要知道如何创建对象,只需要知道如何使用它们。
  2. 提高代码可维护性:如果需要更改对象的创建方式,只需要修改工厂类,而不需要修改客户端代码。
  3. 减少重复代码:将对象创建的逻辑集中在一个地方,避免在多个地方重复相同的创建代码。

举个生活中的例子

想象一下,你有一个玩具店,这个玩具店可以生产不同种类的玩具,比如小汽车、洋娃娃和积木。你只需要告诉店员你想要哪种玩具,店员就会帮你拿出来。

  • 店员:相当于工厂类。
  • 玩具:相当于需要创建的对象。
  • 你告诉店员你想要的玩具类型:相当于客户端代码请求工厂类创建对象。

具体步骤

  1. 定义产品:首先,你需要定义各种玩具,比如小汽车、洋娃娃和积木。
  2. 创建工厂类:然后,你需要创建一个工厂类,这个类有一个方法可以根据你提供的玩具类型来创建相应的玩具。
  3. 使用工厂类:最后,你在需要玩具的时候,只需要调用工厂类的方法,告诉它你想要哪种玩具,它就会返回相应的玩具给你。

优点

  1. 简化客户端代码:客户端代码不需要知道如何创建对象,只需要知道如何使用它们。
  2. 集中管理对象创建:将对象创建的逻辑集中在一个地方,便于管理和维护。
  3. 灵活性高:可以很容易地添加新的玩具类型,只需要修改工厂类,而不需要修改客户端代码。

缺点

  1. 单一职责原则:工厂类可能会变得复杂,因为它需要处理所有对象的创建逻辑。
  2. 不支持扩展:如果需要添加新的玩具类型,必须修改工厂类的代码,这违反了开闭原则(对扩展开放,对修改关闭)。

总结

简单工厂模式就像一个玩具店的店员,你告诉他你想要什么玩具,他就会帮你拿出来。这样你就不需要自己去找这些玩具了,只需要专注于玩就好了。

希望这个解释对你有帮助!如果还有其他问题,尽管问吧。

Q: 那么请用代码实现以下

public interface Animal {  
    void speak();  
}

public class Cat implements Animal {
    @Override
    public void speak() {
        System.out.println("Cat speak!");
    }
}

public class Dog implements Animal {
    @Override
    public void speak() {
        System.out.println("Dog speak!");
    }
}
public class AnimalFactory {
    // 在实际开发中可以使用ApplicationContext 配合@PostConstruct,来获取Animal的所有实现类
    private static Map<String, Animal> map = new HashMap<>();

    static {
        map.put("dog", new Dog());
        map.put("cat", new Cat());
    }

    public static Animal createAnimal(String type) {
        if (map.containsKey(type)) {
            return map.get(type);
        }
        throw new IllegalArgumentException("Unknown animal type");
    }

}

public class Main {
    public static void main(String[] args) {

        // 一般创建dog还是cat,一般可以用type来判断,每个类都有一个type
        // 或者根据配置,环境变量读取等等都可以
        Animal dog = AnimalFactory.createAnimal("dog");
        dog.speak();

        Animal cat = AnimalFactory.createAnimal("cat");
        cat.speak();
    }
}

简单工厂模式就是只有一个factory,根据产品的type来创建不同类型的产品,适用于创建简单的产品。这有是我们在代码中非常常用的一种策略模式,尤其是配合spring来使用,可以达到意想不到的效果。

3. 工厂模式

Q: 那工厂模式呢,请给出详细的解释

什么是工厂模式?

工厂模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。

为什么需要工厂模式?

  1. 解耦:将对象的创建和使用分离,客户端代码不需要知道具体的创建细节。
  2. 扩展性:可以通过添加新的子类来扩展产品种类,而不需要修改现有代码。
  3. 单一职责原则:每个工厂类只负责创建一种产品,职责单一,代码更清晰。

举个生活中的例子

想象一下,你有一个玩具店,这个玩具店有不同的部门,每个部门负责生产一种特定的玩具,比如小汽车部门、洋娃娃部门和积木部门。你只需要找到相应的部门,他们就会帮你生产出你想要的玩具。

  • 玩具店:相当于工厂接口。
  • 不同的部门:相当于具体的工厂类。
  • 玩具:相当于需要创建的对象。
  • 你找到相应的部门:相当于客户端代码请求具体的工厂类创建对象。

具体步骤

  1. 定义产品接口:首先,你需要定义一个玩具接口,所有的玩具都要实现这个接口。
  2. 创建具体产品类:然后,你需要创建具体的玩具类,比如小汽车、洋娃娃和积木,这些类都实现了玩具接口。
  3. 定义工厂接口:接下来,你需要定义一个工厂接口,这个接口有一个方法用来创建玩具。
  4. 创建具体工厂类:然后,你需要创建具体的工厂类,每个工厂类负责创建一种特定的玩具。
  5. 使用工厂类:最后,你在需要玩具的时候,只需要调用相应的工厂类的方法,它就会返回相应的玩具给你。

优点

  1. 解耦:客户端代码不需要知道具体的创建细节,只需要知道工厂接口。
  2. 扩展性:可以通过添加新的具体工厂类来扩展产品种类,而不需要修改现有代码。
  3. 单一职责原则:每个工厂类只负责创建一种产品,职责单一,代码更清晰。

缺点

  1. 类的数量增加:每增加一种产品,就需要增加一个具体的工厂类,类的数量会增加。
  2. 复杂性增加:相比简单工厂模式,工厂模式的结构更复杂,需要定义更多的接口和类。

总结

工厂模式就像一个玩具店的不同部门,每个部门负责生产一种特定的玩具。你只需要找到相应的部门,他们就会帮你生产出你想要的玩具。这样你就不需要自己去创建这些玩具了,只需要专注于使用它们。

希望这个解释对你有帮助!如果还有其他问题,尽管问吧。

Q: 那么请用代码实现以下

public interface AnimalFactory {
    Animal createAnimal();
}

public class CatFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}

public class DogFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}
public class Main {
    public static void main(String[] args) {

        AnimalFactory dogFactory = getFactory("dog");
        Animal dog = dogFactory.createAnimal();
        dog.speak();

        AnimalFactory catFactory = getFactory("cat");
        Animal cat = catFactory.createAnimal();
        cat.speak();

    }

    // 一般创建dogFactory还是catFactory,一般可以用type来判断,每个类都有一个type
    // 或者根绝配置,环境变量读取等等都可以
    public static AnimalFactory getFactory(String animalType) {
        if ("dog".equals(animalType)) {
            return new DogFactory();
        } else if ("cat".equals(animalType)) {
            return new CatFactory();
        }
        throw new IllegalArgumentException("Unknown animal type");
    }
}

工厂模式相比于简单工厂模式,它拥有一个AnimalFactory接口,具体每一个产品都有一个工厂。可以生成很复杂的产品,但随之而来的也是膨胀的factory

4. 抽象工厂模式

Q: 那抽象工厂模式呢,请给出详细的解释

什么是抽象工厂模式?

抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过组合多个工厂方法来实现更复杂的对象创建。

为什么需要抽象工厂模式?

  1. 产品族的概念:当系统需要处理多个产品族时,抽象工厂模式可以提供一个统一的接口来创建这些产品。
  2. 解耦:客户端代码不需要知道具体的产品类,只需要知道工厂接口。
  3. 一致性:确保同一个产品族中的对象一起使用时是兼容的。

举个生活中的例子

想象一下,你有一个家具店,这个家具店可以生产不同风格的家具,比如现代风格和古典风格。每种风格的家具包括椅子和桌子。你只需要告诉店员你想要哪种风格的家具,店员就会帮你生产出相应风格的椅子和桌子。

  • 家具店:相当于抽象工厂接口。
  • 不同风格的家具部门:相当于具体的工厂类。
  • 椅子和桌子:相当于需要创建的对象。
  • 你告诉店员你想要的家具风格:相当于客户端代码请求具体的工厂类创建对象。

具体步骤

  1. 定义产品接口:首先,你需要定义椅子和桌子的接口,所有的椅子和桌子都要实现这些接口。
  2. 创建具体产品类:然后,你需要创建具体的椅子和桌子类,比如现代风格的椅子和桌子,古典风格的椅子和桌子,这些类都实现了相应的接口。
  3. 定义抽象工厂接口:接下来,你需要定义一个抽象工厂接口,这个接口有方法用来创建椅子和桌子。
  4. 创建具体工厂类:然后,你需要创建具体的工厂类,每个工厂类负责创建一种特定风格的椅子和桌子。
  5. 使用工厂类:最后,你在需要家具的时候,只需要调用相应的工厂类的方法,它就会返回相应风格的椅子和桌子给你。

优点

  1. 产品族的创建:可以方便地创建一系列相关或相互依赖的对象。
  2. 解耦:客户端代码不需要知道具体的产品类,只需要知道工厂接口。
  3. 一致性:确保同一个产品族中的对象一起使用时是兼容的。

缺点

  1. 复杂性增加:相比工厂方法模式,抽象工厂模式的结构更复杂,需要定义更多的接口和类。
  2. 扩展困难:如果需要添加新的产品族,需要修改抽象工厂接口及其所有的具体工厂类。

总结

抽象工厂模式就像一个家具店的不同风格部门,每个部门负责生产一种特定风格的家具。你只需要告诉店员你想要哪种风格的家具,他们就会帮你生产出相应风格的椅子和桌子。这样你就不需要自己去创建这些家具了,只需要专注于使用它们。

希望这个解释对你有帮助!如果还有其他问题,尽管问吧。

Q: 那么请用代码实现以下

我们现在不仅有动物,还有食物

public interface AnimalFood {
    void eat();
}

public class CatFood implements AnimalFood {
    @Override
    public void eat() {
        System.out.println("Cat is eating cat food.");
    }
}

public class DogFood implements AnimalFood {
    @Override
    public void eat() {
        System.out.println("Dog is eating dog food.");
    }
}
public interface AnimalFactory {
    Animal createAnimal();
    AnimalFood createAnimalFood();
}

public class CatFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Cat();
    }

    @Override
    public AnimalFood createAnimalFood() {
        return new CatFood();
    }
}

public class DogFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Dog();
    }

    @Override
    public AnimalFood createAnimalFood() {
        return new DogFood();
    }
}

public class Main {
    public static void main(String[] args) {

        AnimalFactory catFactory = new CatFactory();
        Animal cat = catFactory.createAnimal();
        AnimalFood catFood = catFactory.createAnimalFood();

        cat.speak();
        catFood.eat();

        //---------------------------------------//

        AnimalFactory dogFactory = new DogFactory();
        Animal dog = dogFactory.createAnimal();
        AnimalFood dogFood = dogFactory.createAnimalFood();

        dog.speak();
        dogFood.eat();
    }
}

抽象工厂可以方便地创建一系列相关或相互依赖的对象,但其类非常膨胀,在开发过程中用到的还是相对来说比较少的。

5. 最后

文章中所有代码大家都可以在以下链接获取 github

最后此系列会继续更新,欢迎大家点赞收藏和转发

标签:需要,创建,玩具,工厂,接口,ChatGPT,设计模式,public
From: https://www.cnblogs.com/wenbochang/p/18319731

相关文章

  • 设计模式-职责链模式(Chain of Responsibility)
    设计模式-策略模式(ChainofResponsibility)  概要   记忆关键词:传递请求,职责链接  定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链发送请求,直到有一个对象处理它为止。  分析:当客户提交一个请求,请......
  • Java常用设计模式-单例模式
    Java常用设计模式-单例模式JavaDesignPatterns:创建型模式:工厂方法、抽象方法、建造者、原型、单例结构型模式有:适配器、桥接、组合、装饰器、外观、享元、代理行为型模式有:责任链、命令、解释器、迭代器、中介、备忘录、观察者、状态、策略、模板方法、访问者常用设计模式:......
  • 创建型模式-单例设计模式
    一、单例设计模式单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可......
  • 创建型模式-工厂模式
    一、工厂模式先来看这样一个案例:需求:设计一个咖啡店点餐系统。设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。具体类的设计如下:在java中,万物皆对象,这些对象都需要创建......
  • OEE智慧工厂
    后台界面 生产看板状态看板时长看板 生产设置设备信息 完工信息 ......
  • 【设计模式】建造者模式
    设计模式的分类:        创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用new运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。        工厂模式、抽象工厂模式、单例模式、建造者模式......
  • 设计模式-状态模式(State pat)
    设计模式-策略模式(StatePattern)  概要   记忆关键词:状态变成类  定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。  状态模式结构图如下:    一、能解决什么问题?  它主要用来解决对象在多种状态转换时,需要对外输出不同......
  • 【Java常用设计模式】通俗易懂的玩转单例、建造者、工厂、策略模式(保姆篇)
    文章目录单例模式建造者模式工厂模式策略模式本篇小结更多相关内容可查看在一个狂风骤雨的下午,有人突然问了我一句,单例模式是什么,我愣了,相信看完这篇就不会愣了,本文以通俗易懂的方式写的,可能有不严谨的地方......
  • 生产者消费者设计模式
    生产者消费者设计模式学习一、什么是生产者消费者设计模式Java中的生产者-消费者设计模式是一种用于多线程编程的经典设计模式,它用于解决多个线程之间共享资源时的同步和通信问题。这个模式主要用在有数据生产者(Producer)和数据消费者(Consumer)的场景中,生产者负责产生数据,而消费者......
  • 职责链、命令和观察者设计模式的区别
    职责链、命令和观察者是三种不同的设计模式,它们各自解决不同类型的问题。下面分别介绍这三种设计模式的特点和区别:1.职责链模式(ChainofResponsibility)定义:职责链模式是一种行为设计模式,它通过将请求的处理者组织成一个链,使得请求可以沿这条链传递,直到有一个处理者处理......