El patrón de fábrica simple debería haberse introducido en el blog del patrón de fábrica, porque hay una cierta similitud con el patrón de estrategia, que se extrae aquí en un capítulo separado.
Patrón de fábrica simple
El proceso de crear una instancia con una clase separada es la fábrica.
Codigo basico
#include <iostream> usando el espacio de nombres estándar; clase AbstractProduct { public : virtual ~ AbstractProduct () {} virtual void Operation () = 0 ; }; clase ProductA: public AbstractProduct { public : void Operation () {cout << "ProductA" << endl; } }; clase ProductB: public AbstractProduct { public : void Operation () {cout << "ProductB" << endl; } }; clase Factory { public: AbstractProduct * createProduct ( producto char ) { AbstractProduct * ap = NULL; switch (product) { case 'A': ap = new ProductA (); romper ; caso 'B': ap = nuevo ProductoB (); romper ; } return ap; } }; int main () { Factory * f = new Factory (); AbstractProduct * apa = f-> createProduct ('A' ); apa -> Operación (); // ProductA AbstractProduct * apb = f-> createProduct ('B' ); apb -> Operación (); // ProductoB delete apa; eliminar apb; eliminar f; devuelve 0 ; }
Fábrica de computación simple
clase OperationFactory { public : Operation createOperate ( string operating ) { Operation oper = null ; switch (operar) { case " + " : oper = new OperationAdd (); romper ; case " - " : oper = new OperationSub (); romper ; caso " * ": oper = new OperationMul (); romper ; case " / " : oper = new OperationDiv (); romper ; } return oper; } };
Comparación de modelo de fábrica simple y modelo de estrategia
Vea este diagrama UML para recordar el patrón de estrategia que aprendí antes
Los dos parecen ser similares?
La única diferencia es la clase de fábrica simple y la clase de contexto.
El blog original está implementado en Java. Dado que no afecta la lectura y la comprensión, se copia directamente aquí sin modificaciones.
código de clase de fábrica simple y el contexto distinción de clases
clase simple de la fábrica:
clase simple de la fábrica:
clase pública OperationFactory { operación estática pública CreateOperate ( operación de cadena ) { Operation oper = null ; switch (operar) { case " + " : oper = new OperationAdd (); romper ; case " - " : oper = new OperationSub (); romper ; caso " * " : oper = new OperationMul (); romper ; case " / " : oper = new OperationDiv (); romper ; predeterminado : oper = new Operation (); romper ; } return oper; } }
La clase de contexto en el patrón de estrategia:
Contexto de clase { CashSuper csuper; Contexto público (CashSuper cs) { this .csuper = cs; } public Double GetResult ( double money) { // Llame al método de cobro de la clase de estrategia específica return csuper.acceptCash (money); } }
1. Primero observe los parámetros recibidos: el método CreateOperate en la clase de fábrica simple recibe una cadena y devuelve un objeto Operation, y la clase Context necesita recibir un objeto CashSuper cuando se inicializa.
2. En la clase de fábrica simple, se crea un objeto correspondiente de acuerdo con las condiciones recibidas, mientras que la clase Context recibe un objeto, y puede llamar a métodos para ejecutar los métodos de este objeto.
Resumiendo el patrón de fábrica simple y el patrón de estrategia
1. En términos de tipos: el patrón de fábrica simple pertenece al patrón de creación y el patrón de estrategia pertenece al patrón de comportamiento.
2. Luego, mire un pequeño ejemplo:
hay muchos tipos de hacha, hay una fábrica especializada en la producción de hachas de diversas necesidades.
Modo de fábrica:
1) Según el propósito que le dé para producir hachas con diferentes usos, por ejemplo, para cortar personas, entonces la fábrica produce hachas para cortar personas, y si desea iniciar sesión, produce hacha para la tala.
2) Un tipo de objeto que produce diferentes comportamientos de acuerdo con algunos atributos que le devuelve.
3) Concéntrese en el
modo de estrategia de creación de objetos :
1) Use el hacha producida por la fábrica para hacer las cosas correspondientes, por ejemplo, use el hacha para cortar personas y use el hacha para cortar madera.
2) El método correspondiente se ejecuta de acuerdo con el objeto correspondiente que proporcione.
3) La elección del comportamiento de atención
3. Modelo de fábrica simple: de acuerdo con las condiciones de selección del cliente, para ayudar a los clientes a crear un objeto.
Modo de estrategia: el cliente le da un objeto creado y lo ayuda a hacer las cosas correspondientes.
Ventajas y desventajas de los dos modelos
primer vistazo a los dos modos de código de cliente:
// Cliente en modo de fábrica simple: Operación op; // Entregar a clase de fábrica simple para crear objeto op = OperationFactory.CreateOperate ( " + " ); op.StrNumberA = 10 ; op.StrNumberB = 20 ; // Llamar al objeto generado Método doble resultado = op.GetResult (); Console.WriteLine (resultado);
// Cliente en modo de estrategia: doble total = 0 ; vacío privado btnOk_Click ( remitente de objeto , EventArgs e) { CashContext cc = null ; // el cliente crea un interruptor de objeto (cbxType.SelectedItem.ToString ()) { case : " Carga normal " : cc = nuevo CashContext ( nuevo CashNormal ()); pausa ; caso : " Más de 300 devuelve 100 " : cc = new CashContext ( new CashReturn ()); break ; case : " 20% off " : cc = new CashContext ( new CashRebate ()); break ; } // Calcule la tarifa cobrada por la estrategia específica y entréguela a la clase de contexto para ejecutar el método correspondiente , El cliente solo necesita recibir el valor devuelto para doble acceptMoney = cc.GetResult (Convert.ToDouble (txtPrice.Text) * Convert.ToDouble (txtNum.Text)); // Calcular el costo total total + = acceptMoney; listBox1.Items .Agregar ( " Precio unitario: " + txtPrice.Text + "数量 :" + txtNum.Text + " " + comboBox1.SelectedItem.ToString () + " 总计 :" + acceptMoney); lblResult.Text = total.ToString (); }
Al comparar el código del cliente, se descubre que el
patrón de fábrica simple: la creación del objeto se transfiere a la clase de fábrica simple. El cliente solo necesita ingresar las condiciones correspondientes, y no es responsable de la creación del objeto, pero el cliente debe llamar al método de clase de algoritmo . Pero una vez que necesite agregar una nueva clase de operación, como la operación de raíz abierta, debe modificar la clase de fábrica simple.
Modo de estrategia: la selección y creación de objetos aún debe realizarla usted mismo, pero la responsabilidad de llamar a los métodos se le otorga a la clase Context. Una vez que se necesita agregar una nueva estrategia, se debe modificar el cliente.
Por lo tanto, la deficiencia del modelo de fábrica simple es que cuando aumenta la nueva demanda, la clase de fábrica debe modificarse con frecuencia. Solo se utiliza el modo de estrategia. Cuando aumentan los nuevos requisitos, el cliente necesita ser modificado. El cliente todavía tiene la responsabilidad de crear objetos y no reduce la presión sobre el cliente. Para usar estos dos modos juntos, debe modificar la clase Context, que de todos modos no es perfecta.