Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Factory Pattern es un patrón de diseño comúnmente utilizado en la programación orientada a objetos.patrón creacional un poco.El patrón de fábrica se usa principalmente para crear objetos, pero es diferente de usarlo directamente en el código.new
La creación de palabras clave se diferencia en que crea objetos a través de una interfaz común, separando así el proceso de creación de objetos del uso de código de cliente. La siguiente es una introducción detallada al patrón de fábrica:
Los patrones de fábrica se dividen principalmente en tres tipos: patrones de fábrica simples (patrones de fábrica estáticos), patrones de método de fábrica y patrones de fábrica abstractos.
Diagrama de clases de patrón de fábrica simple
Patrón de método de fábrica
patrón abstracto de fábrica
El patrón de fábrica tiene una amplia gama de aplicaciones en desarrollo real, como conexiones de bases de datos, controles de interfaz de usuario, procesamiento de archivos, registro, comunicaciones de red, colas de mensajes, estructuras de datos, cifrado y descifrado, envío de mensajes y programación de tareas. En estos escenarios, el uso del patrón de fábrica puede separar el proceso de creación de objetos del proceso de uso, mejorando la flexibilidad y escalabilidad del sistema.
En el patrón de fábrica simple, definimos una clase de fábrica que puede devolver instancias de diferentes tipos según los parámetros pasados.
A continuación se muestra un ejemplo de un patrón de fábrica simple escrito en Java. Crearemos una fábrica de formas que pueda producir instancias de círculos, rectángulos y cuadrados. Primero, definimos una interfaz de forma (Shape) y varias clases concretas (Círculo, Rectángulo, Cuadrado) que implementan esta interfaz.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
A continuación, definimos una clase de fábrica (ShapeFactory) que utiliza métodos estáticos para generar objetos de forma.
- // 形状工厂类
- class ShapeFactory {
-
- // 使用 getShape 方法获取形状类型的对象
- public static Shape getShape(String shapeType){
- if(shapeType == null){
- return null;
- }
- if(shapeType.equalsIgnoreCase("CIRCLE")){
- return new Circle();
- } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
- return new Rectangle();
- } else if(shapeType.equalsIgnoreCase("SQUARE")){
- return new Square();
- }
-
- return null;
- }
- }
Finalmente, podemos usar una clase de fábrica para obtener objetos de forma y llamar a susdraw
método.
- public class FactoryPatternDemo {
-
- public static void main(String[] args) {
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = ShapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 获取 Rectangle 的对象,并调用它的 draw 方法
- Shape shape2 = ShapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 获取 Square 的对象,并调用它的 draw 方法
- Shape shape3 = ShapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
En este ejemplo,ShapeFactory
La clase es responsable de crear.Shape
Una instancia de la interfaz.El código del cliente hace esto pasando información de tipo (por ejemplo, cadena) aShapeFactory
método estático de clasegetShape
para obtener una instancia de la forma deseada. De esta manera, el cliente se desacopla de la implementación de la clase específica y cumple con el principio de apertura y cierre, es decir, se pueden ampliar nuevas clases de formas sin modificar el código del cliente. Sin embargo, una desventaja importante del patrón de fábrica simple es que si el sistema necesita ampliarse con nuevas familias de productos (como colores además de formas, etc.), es necesario modificar la clase de fábrica, lo que viola parte del patrón abierto. -principio cerrado. En este caso, considere utilizar el patrón Factory Method o el patrón Abstract Factory.
Aún tomando forma como ejemplo, utilizamos métodos de ingeniería para crearlo.
Primero defina la interfaz de forma (Producto) y cree tres clases de implementación.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
A continuación, defina la interfaz del creador (Creator) y el creador concreto (Concrete Creator):
- // 创建者接口
- interface ShapeFactory {
- Shape getShape(String shapeType);
- }
-
- // 具体创建者类
- class RectangleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("RECTANGLE")) {
- return new Rectangle();
- }
- return null;
- }
- }
-
- class CircleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("CIRCLE")) {
- return new Circle();
- }
- return null;
- }
- }
-
- class SquareFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("SQUARE")) {
- return new Square();
- }
- return null;
- }
- }
Finalmente, use la clase creadora concreta para obtener los objetos de forma y llamar a susdraw
método:
- public class FactoryMethodPatternDemo {
-
- public static void main(String[] args) {
- ShapeFactory shapeFactory = new CircleFactory();
-
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = shapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 使用 RectangleFactory 来获取 Rectangle 的对象
- shapeFactory = new RectangleFactory();
- Shape shape2 = shapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 使用 SquareFactory 来获取 Square 的对象
- shapeFactory = new SquareFactory();
- Shape shape3 = shapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
En este ejemplo,Creamos una clase de fábrica correspondiente para cada clase de forma. (Aunque en aplicaciones reales, generalmente habrá una estructura de clases de fábrica más general, tal vez a través de archivos de configuración o reflexión para evitar escribir clases de fábrica separadas para cada clase de producto). Esto ayuda a demostrar los fundamentos del patrón Factory Method,Es decir, deje que la subclase de fábrica decida qué clase crear una instancia. . Sin embargo, para el caso simple de este ejemplo, es posible que se sienta más inclinado a utilizar el patrón Simple Factory o considerar otros patrones de diseño para reducir la duplicación de código.
Este ejemplo toma como ejemplo los teléfonos móviles, productos abstractos relacionados con los teléfonos móviles (como pantallas, baterías, sistemas operativos, etc.) y crea clases de productos específicas para implementar estas interfaces. Luego podemos definir interfaces de fábrica abstractas y clases de fábrica concretas para producir estos productos. A continuación se muestra un ejemplo simplificado que muestra cómo utilizar el patrón Abstract Factory para producir componentes (pantallas y baterías) para diferentes marcas y modelos de teléfonos móviles:
Primero, defina la interfaz del producto y los productos específicos:
- // 屏幕接口
- interface Screen {
- void display();
- }
-
-
- // 高端屏幕的实现
- class HighEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示高清屏幕");
- }
- }
-
- // 低端屏幕的实现
- class LowEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示普通屏幕");
- }
- }
-
-
- // 电池接口
- interface Battery {
- void charge();
- }
-
-
- // 高效电池的实现
- class HighEfficiencyBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("快速充电");
- }
- }
-
- // 标准电池的实现
- class StandardBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("标准充电");
- }
- }
A continuación, defina la interfaz de fábrica abstracta y la clase de fábrica concreta:
- // 手机组件工厂接口
- interface PhoneFactory {
- Screen createScreen();
- Battery createBattery();
- }
-
- // 高端手机工厂
- class HighEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new HighEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new HighEfficiencyBattery();
- }
- }
-
- // 低端手机工厂
- class LowEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new LowEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new StandardBattery();
- }
- }
Finalmente, el código del cliente, que utiliza una fábrica abstracta para crear objetos de producto concretos:
- public class PhoneFactoryPatternDemo {
- public static void main(String[] args) {
- // 使用高端手机工厂
- PhoneFactory highEndFactory = new HighEndPhoneFactory();
- Screen highEndScreen = highEndFactory.createScreen();
- Battery highEndBattery = highEndFactory.createBattery();
-
- highEndScreen.display();
- highEndBattery.charge();
-
- // 使用低端手机工厂
- PhoneFactory lowEndFactory = new LowEndPhoneFactory();
- Screen lowEndScreen = lowEndFactory.createScreen();
- Battery lowEndBattery = lowEndFactory.createBattery();
-
- lowEndScreen.display();
- lowEndBattery.charge();
- }
- }
En este ejemplo, definimos dos fábricas de teléfonos móviles (gama alta y gama baja), cada una capaz de producir un tipo específico de pantalla y batería.El código del cliente interactúa con la clase de fábrica específica a través de una interfaz de fábrica abstracta, logrando así el desacoplamiento de la clase de producto específica. . De esta manera, si necesitamos agregar nuevos tipos de teléfonos en el futuro (por ejemplo, teléfonos de gama media), solo necesitamos agregar nuevas clases de productos y las clases de fábrica correspondientes sin modificar el código de cliente existente.
El patrón de fábrica es un patrón de diseño muy útil,Encapsula el proceso de creación de objetos, reduce el acoplamiento, mejora la escalabilidad del programa y la facilidad de mantenimiento, etc. , ha sido ampliamente utilizado en el desarrollo de software.Sin embargo, también tiene algunosDesventajas, como responsabilidades excesivas de fábrica, dificultad en la expansión del sistema, etc. . Por lo tanto, en aplicaciones prácticas, es necesario hacer concesiones y elecciones basadas en escenarios y necesidades específicas.
Si el patrón de fábrica (fábrica simple, método de fábrica, fábrica abstracta) le resulta útil, recuerde darle me gusta y recopilarlo.