1. 前言
在工作过程中,越发觉得计划模式的重要性。经常会有人说工作5年的人,大学生任意培训1-2月也能做同样的工作,没错,大学生简直可以做。
但其写的代码,可维护性、可扩展性、添加新功能时方便还是简单。甚至是软实力的表现,如何沟通、如何推进项目进展、如何做项目排期,其实都是应届生所不具备的。(固然工作5年的人和大学生没不一样的,那你就应该被社会所淘汰,不裁你,裁谁呢)
大家不需要趾高气昂,但也不必要妄自菲薄。
针对此,我出了 《跟着ChatGPT学习计划模式》系列,欢迎大家点赞收藏转发,今天我们学习工厂模式。包括:简单工厂模式、工厂模式、抽象工厂模式
2. 简单工厂模式
Q: 请你详细表明一下 简单计划工厂模式,回答要简洁,让小朋友也能听懂那种
什么是简单工厂模式?
简单工厂模式是一种计划模式,它通过一个专门的类来负责创建其他类的实例。这个专门的类通常被称为“工厂类”。简单工厂模式的重要目的是将对象的创建过程封装起来,使得客户端代码不需要知道具体的创建细节。
为什么需要简单工厂模式?
- 简化对象创建:客户端代码不需要知道如何创建对象,只需要知道如何使用它们。
- 提高代码可维护性:假如需要更改对象的创建方式,只需要修改工厂类,而不需要修改客户端代码。
- 淘汰重复代码:将对象创建的逻辑集中在一个地方,避免在多个地方重复相同的创建代码。
举个生活中的例子
想象一下,你有一个玩具店,这个玩具店可以生产不同种类的玩具,比如小汽车、洋娃娃和积木。你只需要告诉伙计你想要哪种玩具,伙计就会帮你拿出来。
- 伙计:相当于工厂类。
- 玩具:相当于需要创建的对象。
- 你告诉伙计你想要的玩具类型:相当于客户端代码请求工厂类创建对象。
具体步调
- 定义产品:起首,你需要定义各种玩具,比如小汽车、洋娃娃和积木。
- 创建工厂类:然后,你需要创建一个工厂类,这个类有一个方法可以根据你提供的玩具类型来创建相应的玩具。
- 使用工厂类:末了,你在需要玩具的时候,只需要调用工厂类的方法,告诉它你想要哪种玩具,它就会返回相应的玩具给你。
长处
- 简化客户端代码:客户端代码不需要知道如何创建对象,只需要知道如何使用它们。
- 集中管理对象创建:将对象创建的逻辑集中在一个地方,便于管理和维护。
- 机动性高:可以很轻易地添加新的玩具类型,只需要修改工厂类,而不需要修改客户端代码。
缺点
- 单一职责原则:工厂类大概会变得复杂,因为它需要处理所有对象的创建逻辑。
- 不支持扩展:假如需要添加新的玩具类型,必须修改工厂类的代码,这违反了开闭原则(对扩展开放,对修改关闭)。
总结
简单工厂模式就像一个玩具店的伙计,你告诉他你想要什么玩具,他就会帮你拿出来。如许你就不需要自己去找这些玩具了,只需要专注于玩就好了。
希望这个表明对你有帮助!假如另有其他问题,只管问吧。
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: 那工厂模式呢,请给出详细的表明
什么是工厂模式?
工厂模式是一种创建型计划模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。
为什么需要工厂模式?
- 解耦:将对象的创建和使用分离,客户端代码不需要知道具体的创建细节。
- 扩展性:可以通过添加新的子类来扩展产品种类,而不需要修改现有代码。
- 单一职责原则:每个工厂类只负责创建一种产品,职责单一,代码更清晰。
举个生活中的例子
想象一下,你有一个玩具店,这个玩具店有不同的部门,每个部门负责生产一种特定的玩具,比如小汽车部门、洋娃娃部门和积木部门。你只需要找到相应的部门,他们就会帮你生产出你想要的玩具。
- 玩具店:相当于工厂接口。
- 不同的部门:相当于具体的工厂类。
- 玩具:相当于需要创建的对象。
- 你找到相应的部门:相当于客户端代码请求具体的工厂类创建对象。
具体步调
- 定义产品接口:起首,你需要定义一个玩具接口,所有的玩具都要实现这个接口。
- 创建具体产品类:然后,你需要创建具体的玩具类,比如小汽车、洋娃娃和积木,这些类都实现了玩具接口。
- 定义工厂接口:接下来,你需要定义一个工厂接口,这个接口有一个方法用来创建玩具。
- 创建具体工厂类:然后,你需要创建具体的工厂类,每个工厂类负责创建一种特定的玩具。
- 使用工厂类:末了,你在需要玩具的时候,只需要调用相应的工厂类的方法,它就会返回相应的玩具给你。
长处
- 解耦:客户端代码不需要知道具体的创建细节,只需要知道工厂接口。
- 扩展性:可以通过添加新的具体工厂类来扩展产品种类,而不需要修改现有代码。
- 单一职责原则:每个工厂类只负责创建一种产品,职责单一,代码更清晰。
缺点
- 类的数量增长:每增长一种产品,就需要增长一个具体的工厂类,类的数量会增长。
- 复杂性增长:相比简单工厂模式,工厂模式的布局更复杂,需要定义更多的接口和类。
总结
工厂模式就像一个玩具店的不同部门,每个部门负责生产一种特定的玩具。你只需要找到相应的部门,他们就会帮你生产出你想要的玩具。如许你就不需要自己去创建这些玩具了,只需要专注于使用它们。
希望这个表明对你有帮助!假如另有其他问题,只管问吧。
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: 那抽象工厂模式呢,请给出详细的表明
什么是抽象工厂模式?
抽象工厂模式是一种创建型计划模式,它提供一个接口,用于创建一系列相关或相互依靠的对象,而无需指定它们具体的类。抽象工厂模式通过组合多个工厂方法来实现更复杂的对象创建。
为什么需要抽象工厂模式?
- 产品族的概念:当体系需要处理多个产品族时,抽象工厂模式可以提供一个统一的接口来创建这些产品。
- 解耦:客户端代码不需要知道具体的产品类,只需要知道工厂接口。
- 一致性:确保同一个产品族中的对象一起使用时是兼容的。
举个生活中的例子
想象一下,你有一个家具店,这个家具店可以生产不同风格的家具,比如当代风格和古典风格。每种风格的家具包括椅子和桌子。你只需要告诉伙计你想要哪种风格的家具,伙计就会帮你生产出相应风格的椅子和桌子。
- 家具店:相当于抽象工厂接口。
- 不同风格的家具部门:相当于具体的工厂类。
- 椅子和桌子:相当于需要创建的对象。
- 你告诉伙计你想要的家具风格:相当于客户端代码请求具体的工厂类创建对象。
具体步调
- 定义产品接口:起首,你需要定义椅子和桌子的接口,所有的椅子和桌子都要实现这些接口。
- 创建具体产品类:然后,你需要创建具体的椅子和桌子类,比如当代风格的椅子和桌子,古典风格的椅子和桌子,这些类都实现了相应的接口。
- 定义抽象工厂接口:接下来,你需要定义一个抽象工厂接口,这个接口有方法用来创建椅子和桌子。
- 创建具体工厂类:然后,你需要创建具体的工厂类,每个工厂类负责创建一种特定风格的椅子和桌子。
- 使用工厂类:末了,你在需要家具的时候,只需要调用相应的工厂类的方法,它就会返回相应风格的椅子和桌子给你。
长处
- 产品族的创建:可以方便地创建一系列相关或相互依靠的对象。
- 解耦:客户端代码不需要知道具体的产品类,只需要知道工厂接口。
- 一致性:确保同一个产品族中的对象一起使用时是兼容的。
缺点
- 复杂性增长:相比工厂方法模式,抽象工厂模式的布局更复杂,需要定义更多的接口和类。
- 扩展困难:假如需要添加新的产品族,需要修改抽象工厂接口及其所有的具体工厂类。
总结
抽象工厂模式就像一个家具店的不同风格部门,每个部门负责生产一种特定风格的家具。你只需要告诉伙计你想要哪种风格的家具,他们就会帮你生产出相应风格的椅子和桌子。如许你就不需要自己去创建这些家具了,只需要专注于使用它们。
希望这个表明对你有帮助!假如另有其他问题,只管问吧。
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
末了此系列会继承更新,欢迎大家点赞收藏和转发
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |