Java 中设计模式 之 工厂模式,java反射机制的底层原理

HarmonyOS学习 2021-11-25 18:56:31
java 面试 编程语言 后端开发

 一、简单工厂模式

 1、概述

 2、实现

 二、工厂方法模式

 1、概述

 2、实现

 三、抽象工厂模式

 1、概述

 2、实现

 三、总结

 1、工厂模式优点

 2、工厂模式适用场景

 3、三种模型的区别


一、简单工厂模式

============

1、概述


简单工厂模式也叫静态工厂模式,将所有的创建对象任务交给了一个工厂类来实现,要想使用对象,直接找工厂类即可。

以动物工厂类为例,可以将创建动物对象的任务全放在动物工厂类来实现,在动物工厂类中定义静态方法,根据传递不同的参数类创建不同的动物对象。

要素分析:

  1. 定义抽象类:动物具有共同的属性:吃,因此可以创建一个动物抽象类,定义“吃”的抽象方法

  2. 定义具体的操作类:动物有很多,以猫和狗为例,创建猫类和狗类,继承动物类,实现“吃”的抽象方法

  3. 定义简单工厂:根据传递不同的参数类创建不同的动物对象

  4. 测试类:调用工厂类创建对象

2、实现


【1】定义抽象类

public abstract class Animal {

public abstract void eat();

}

【2】定义具体操作类

public class Cat extends Animal{

public void eat() {

System.out.println(“猫吃鱼”);

}

}

public class Dog extends Animal {

public void eat() {

System.out.println(“狗吃肉”);

}

}

【3】定义简单工厂

public class Factory {

public static Animal creatAnimal(String name){

if(“cat”.equals(name)){

return new Cat();

}else if (“dog”.equals(name)){

return new Dog();

}

return null;

}

}

【4】测试类

public static void main(String[] args){

Animal cat = Factory.creatAnimal(“cat”);

Animal dog = Factory.creatAnimal(“dog”);

cat.eat();

dog.eat();

}

二、工厂方法模式

========

1、概述


在简单工厂模式当中,是根据需要传递响应的参数去调用工厂中的方法创建对象,但开发人员并不知道哪些参数能够传递,这样就造成返回不了自己想要的对象的后果,而工厂方法模式将每个对象都交给各自工厂去创建,避免了这种弊端。

要素分析:

  • 工厂接口:工厂接口是工厂方法模式的核心,与调用者直接交互来提供产品,在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质是一样的。

  • 工厂实现:工厂实现决定如何实例化产品,是实现拓展的途径,需要有多少种产品就需要多少个具体的工厂实现

  • 产品接口:产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品 接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。

  • 产品实现:实现产品接口的具体类,决定了产品在客户端中的具体行为。

2、实现


【1】工厂接口

public interface Factory {

public abstract Animal createAnimal();

}

【2】工厂实现类

public class catFactory implements Factory{

public Animal createAnimal() {

return new Cat();

}

}

public class dogFactory implements Factory {

public Animal createAnimal() {

return new Dog();

}

}

【3】产品接口

public abstract class Animal {

public abstract void eat();

}

【4】实现产品类

public class Cat extends Animal {

public void eat() {

System.out.println(“猫吃鱼”);

}

}

public class Dog extends Animal {

public void eat() {

System.out.println(“狗吃肉”);

}

}

【5】测试类

public class Test {

public static void main(String[] args){

Factory catfactory = new catFactory();

Animal cat = catfactory.createAnimal();

Factory dogfactory = new dogFactory();

Animal dog = dogfactory.createAnimal();

cat.eat();

dog.eat();

}

}

三、抽象工厂模式

========

1、概述


在抽象工厂中,有一个产品族的概念:即位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模型所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。

要素分析:

  • 抽象工厂:声明一组用于创建一族产品的方法,每个方法对应一种对象;在抽象工厂中声明了多个工厂方法, 用于创建不同类型

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

的对象, 抽象工厂可以是接口, 也可以是抽象类或者具体类

  • 具体工厂:具体工厂实现了抽象工厂,每个工厂方法返回一个具体对象,一个具体工厂所创建的具体对象构成一个族

  • 抽象类接口:提供一组所有类都具有的业务方法

  • 抽象类:用于实现抽象接口所定义的业务方法,但是该角色对于抽象接口定义的方法只做抽象实现,即所有实现都被定义为抽象方法,最终的具体实现全部交给具体类实现。引入该角色主要是为了根据声明不同的抽象类,将类区分为不同的等级结构

  • 具体类:该角色继承抽象类,主要用于实现抽象类中声明的抽象方法,完成不同等级结构,不同族的业务方法的具体实现

2、实现


package com.liebrother.designpatterns.abstractfactory;

public class AbstractFactoryTest {

public static void main(String[] args) {

// 宝马员工安装轮胎和方向盘

AbstractCarFactory bmwCarFacatory = new BMWCarFactory();

bmwCarFacatory.installWheel();

bmwCarFacatory.installSteeringWheel();

// 奔驰员工安装轮胎和方向盘

AbstractCarFactory mercedesCarFacatory = new MercedesCarFacatory();

mercedesCarFacatory.installWheel();

mercedesCarFacatory.installSteeringWheel();

}

}

/**

  • 汽车抽象工厂

*/

interface AbstractCarFactory {

void installWheel();

void installSteeringWheel();

}

/**

  • 宝马工厂

*/

class BMWCarFactory implements AbstractCarFactory {

@Override

public void installWheel() {

WheelFacatory wheelFacatory = new BMWWheelFacatory();

String wheel = wheelFacatory.createWheel();

System.out.println(“安装轮胎:” + wheel);

}

@Override

public void installSteeringWheel() {

SteeringWheelFacatory steeringWheelFacatory = new BMWSteeringWheelFacatory();

String steeringWheel = steeringWheelFacatory.createSteeringWheel();

System.out.println(“安装方向盘:” + steeringWheel);

}

}

/**

  • 奔驰工厂

*/

class MercedesCarFacatory implements AbstractCarFactory {

@Override

public void installWheel() {

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

Java 中设计模式 之 工厂模式,java反射机制的底层原理_面试

本文已被 CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

版权声明
本文为[HarmonyOS学习]所创,转载请带上原文链接,感谢
https://blog.51cto.com/u_15438507/4690493

  1. 图解 Kafka 线程模型及其设计缺陷
  2. Add data files for Oracle tablespaces or temporary tablespaces
  3. Intellij IDEA神器居然还有这些小技巧,mysql集群搭建视频
  4. IntelliJ IDEA(2019)之Web项目创建,掌门一对一java面试题
  5. InnoDB(2,如何访问Redis中的海量数据
  6. InheritableThreadLocal使用详解,java多线程面试题及答案整理
  7. How does Oracle modify the data type of a column
  8. Oracle 12C 12.1.0.1.0 management control file official document translation instructions
  9. Oracle 10g 10.2.0.1 in Oracle Linux 5.4 32bit RAC installation manual (Yimo Xiyang)
  10. Oracle 12C in Oracle Linux 6.5 64bit installation manual
  11. 一天十道Java面试题----第一天(面向对象-------》ArrayList和LinkedList)
  12. Schéma du modèle de fil Kafka et de ses défauts de conception
  13. Starting and shutting down Oracle RAC database cluster
  14. CRS_ Oracle CRS stack is already configured and will be running under init(1M)
  15. Common skills of Oracle stored procedure
  16. Check the number of CPUs, core books and threads of the Linux system
  17. jQuery-实例方法
  18. Oracle de duplicated data
  19. jQuery-dom和jQuery,入口函数(基本知识)
  20. Oracle creates unique constraints on columns that already have duplicate data
  21. JavaScript-拷贝
  22. JavaScript-this指向问题
  23.  There is ^ [[a garbled code problem in the up and down keys in Oracle sqlplus
  24. JavaScript-封装与继承(两种)
  25. JavaScript-包装类型
  26. JavaScript-传值(引用类型,基本类型)
  27. JavaScript-面向对象(构造函数,实例成员,静态成员)
  28. JavaScript-解构赋值
  29. JavaScript-箭头函数
  30. JavaScript-参数
  31. JavaScript-预解析(变量提升)
  32. JavaScript-闭包closure
  33. JavaScript-声明变量的关键字
  34. JavaScript - mot - clé pour déclarer une variable
  35. Fermeture de fermeture JavaScript
  36. JavaScript Pre - parse (promotion des variables)
  37. Paramètres JavaScript
  38. Fonction de flèche JavaScript
  39. JavaScript - déconstruction assignations
  40. Common annotations in springboot
  41. Building CentOS 7.6 with Linux
  42. JavaScript - orienté objet (constructeur, membre d'instance, membre statique)
  43. JavaScript value Transfer (reference type, Basic type)
  44. JavaScript - type d'emballage
  45. linux deepin/ubuntu安装flameshot火焰截图
  46. JavaScript - encapsulation et héritage (deux)
  47. JavaScript JS method for writing 99 multiplication table
  48. 從零開始學java - 第二十五天
  49. Apprendre Java à partir de zéro - jour 25
  50. Les voitures d'hiver, les voitures électriques et les voitures à essence ne sont pas les mêmes?
  51. JavaScript - ceci pointe vers le problème
  52. Copie JavaScript
  53. Spring boot quickly integrates swagger
  54. linux deepin/ubuntu安裝flameshot火焰截圖
  55. Capture d'écran de flamme de l'installateur de flamme Linux deepin / Ubuntu
  56. Jquery DOM et jquery, fonctions d'entrée (bases)
  57. Méthode d'instance jquery
  58. Méthode et démonstration de code dans l'interface de liste en Java
  59. Démarrage du Zookeeper
  60. Java oom Cognition