Patrón de diseño の patrón de fábrica simple



1. Resumen

El patrón de diseño es un resumen de la experiencia de desarrollo de código de los predecesores. Es una serie de rutinas. No es una regulación gramatical, sino una solución para mejorar la reutilización, mantenibilidad, legibilidad y seguridad del código.

En 1995, GoF publicó un libro "Patrones de diseño", que incluía 23 patrones de diseño. Desde entonces, se ha establecido un hito en el campo de los patrones de diseño.


1.1 Tipos de patrones de diseño

  • Modo de creación
  • Modelo estructural
  • Modelo de comportamiento

Patrón de creador
Estos patrones de diseño proporcionan una forma de ocultar la lógica de creación al crear un objeto, en lugar de instanciar el objeto directamente con el nuevo operador. Esto hace que el programa sea más flexible para determinar qué objetos deben crearse para una instancia determinada.

Patrones estructurales
Estos patrones de diseño se centran en la combinación de clases y objetos. El concepto de herencia se utiliza para combinar interfaces y definir las formas en que los objetos combinados obtienen nuevas funciones.

Patrones de comportamiento
Estos patrones de diseño prestan especial atención a la comunicación entre objetos.



1.2 Principios de los patrones de diseño

1. Principio de apertura y cierre

El principio de los medios de apertura y cierre: abierto para extensión y cerrado para modificación. Cuando es necesario expandir el programa, el código original no se puede modificar para lograr un efecto intercambiable en caliente. En resumen, es hacer que el programa sea extensible, fácil de mantener y actualizar. Para lograr este efecto, necesitamos utilizar interfaces y clases abstractas, que mencionaremos en el diseño específico más adelante.

2. Principio de sustitución de Liskov

El principio de sustitución de Richter es uno de los principios básicos del diseño orientado a objetos. El principio de sustitución de Richter dice que dondequiera que pueda aparecer una clase base, debe aparecer una subclase. LSP es la piedra angular de la herencia y la reutilización. Solo cuando la clase derivada puede reemplazar a la clase base y la función de la unidad de software no se ve afectada, la clase base realmente se puede reutilizar y la clase derivada también puede agregar nuevas sobre la base del comportamiento de la clase base. El principio de sustitución de Richter es un complemento del principio de apertura y cierre. El paso clave para realizar el principio de apertura y cierre es la abstracción, y la relación de herencia entre la clase base y la subclase es la realización concreta de la abstracción, por lo que el principio de sustitución de Richter es la especificación de los pasos concretos para realizar la abstracción.

3. Principio de inversión de la dependencia

Este principio es la base del principio de apertura y cierre, el contenido específico: para la programación de interfaces, confíe en la abstracción en lugar del concreto.

4. Principio de segregación de interfaces

Este principio significa que usar múltiples interfaces aisladas es mejor que usar una sola interfaz. También tiene otro significado: reducir el grado de acoplamiento entre clases. Se puede ver que, de hecho, el patrón de diseño es una idea de diseño de software que parte de una arquitectura de software a gran escala y es fácil de actualizar y mantener, enfatizando la reducción de la dependencia y la reducción del acoplamiento.

5. Principio de Demeter, también conocido como Principio de Demeter

El principio de conocimiento mínimo significa que una entidad debe interactuar con otras entidades lo menos posible para que los módulos funcionales del sistema sean relativamente independientes.

6. Principio de reutilización compuesta

El principio de la reutilización de la composición es: intente utilizar la composición / agregación en lugar de la herencia.




2. Modelo de fábrica simple

A través del ejemplo de la calculadora. Ilustrar cómo utilizar ideas orientadas a objetos para la programación.



2.1 Primero mira el ejemplo más simple

                Console.WriteLine("请输入数字A");
                string A = Console.ReadLine();
                Console.WriteLine("请输入运算符号");
                string B = Console.ReadLine();
                Console.WriteLine("请输入数字B");
                string C = Console.ReadLine();
                string D = "0";

                if (B == "+")
                {
    
    
                    D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(B));
                }
                if (B == "-")
                {
    
    
                    D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(B));
                }
                if (B == "*")
                {
    
    
                    D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(B));
                }
                if (B == "/")
                {
    
    
                    D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(B));
                }

                Console.WriteLine($"运算完成后的结果是{D}");

2.2 Problemas con el código anterior

1. El código de este método de denominación es extremadamente irregular.

string A = Console.ReadLine();

2. Ramas de juicio, esto equivale a emitir juicios por cada condición, lo que equivale a tres trabajos inútiles por computadora.

 if (B == "+")
 {
    
    
     D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(B));
  }

3. ¿Qué debo hacer si el divisor es 0 o el símbolo se ingresa incorrectamente? Sin mecanismo de manejo de errores

if (B == "/")
 {
    
    
     D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(B));
 }

4. No utilizó el pensamiento orientado a objetos (tome la impresión de tipos móviles como ejemplo)

  • Mantenibilidad: si desea cambiar, simplemente cambie las palabras que desea cambiar.
  • Reutilización: reutiliza todas las palabras que se pueden usar antes.
  • Escalabilidad: si desea agregar palabras, solo necesita agregar letras adicionales
  • Buena flexibilidad: la clasificación de palabras puede tener que organizarse horizontal o verticalmente, ya sea

2.3 Pensamiento orientado a objetos

Si desea utilizar ideas de diseño orientadas a objetos, debe considerar completamente el uso de encapsulación, herencia y polimorfismo para reducir el grado de acoplamiento del programa.


2.3.1 Copiar frente a reutilizar

El programa anterior se completa usando la línea de comando.Si queremos usar la calculadora de abajo para completar dicha función, ¿cómo lograr la reutilización del código?

Simplemente copie el código interno. Esto no es suficiente. Este enfoque se llama copiar, no reutilizar.



2.3.2 Encapsulación empresarial

El uso de la encapsulación puede separar la lógica empresarial y la lógica de la interfaz y reducir el acoplamiento entre ellas, de modo que se pueda lograr el propósito de integración, mantenimiento y expansión.

 public class Operation {
    
    
        public static double GetResult(double numberA, double numberB, string operate)
        {
    
    
            double result = 0;
            switch (operate)
            {
    
    
                case "+":
                    result = numberA + numberB;
                    break;
                case "-":
                    result = numberA - numberB;
                    break;
                case "*":
                    result = numberA * numberB;
                    break;
                case "/":
                    result = numberA / numberB;
                    break;
            }
            return result;
        }
    }



2.3.3 Estrechamente acoplado vs débilmente acoplado

Sobre la base del código anterior, si agrega otra operación de apertura de raíz, ¿cómo usarla? Indiferente, puede cambiar directamente la clase de operación, simplemente agregue una rama al interruptor. El problema es que los cálculos originales de suma, resta, multiplicación y división son correctos. Ahora, si cambia la multiplicación original a suma durante el proceso de modificación, es equivalente a cambiar la función original y el efecto se reducirá considerablemente.

En este momento, debe escribir GetRestult como método virtual


referencias

[1] https://www.runoob.com/design-pattern/design-pattern-intro.html

Supongo que te gusta

Origin blog.csdn.net/zhaozhao236/article/details/110792261
Recomendado
Clasificación