Definición de patrones de fábrica: proporciona una interfaz para crear objetos.
Por qué usar el modo de fábrica
El modelo de fábrica es el modelo más utilizado que utilizamos.
¿Por qué el modelo de fábrica se usa tan comúnmente? Debido a que el patrón de fábrica es equivalente a crear nuevos objetos de instancia, a menudo tenemos que generar objetos de instancia basados en la clase de clase. ¿Necesita tener más cuidado.
Tomemos la clase de muestra como ejemplo.
La copia del código es la siguiente:
Muestra muestra = nueva muestra ();
Sin embargo, la realidad es que generalmente hacemos algún trabajo de inicialización al crear instancias de muestra, como bases de datos de consultas de asignación, etc.
En primer lugar, lo que pensamos es que podemos usar el constructor de muestra, para que la instancia se genere y escriba como:
La copia del código es la siguiente:
Muestra muestra = nueva muestra (parámetro);
Sin embargo, si el trabajo de inicialización realizado al crear una instancia de muestra no es tan simple como la asignación, puede ser un código largo de código.
¿Por qué el código es feo? El método es equivalente a poner muchos huevos en él. Envío de código largo en cada segmento, y el segmento está "encapsulado" nuevamente (reduciendo la conexión de acoplamiento entre segmentos), de modo que los riesgos se diversificarán. No más cosas que afectarán a cada segmento.
En este ejemplo, primero, necesitamos separar el trabajo de crear una instancia del trabajo de usar una instancia, es decir, separar la gran cantidad de trabajo de inicialización requerido para crear una instancia del constructor de la muestra.
En este momento, necesitamos el patrón de fábrica de fábrica para generar objetos, y ya no podemos usar la nueva muestra simple (parámetros). Además, si la muestra tiene una herencia como mySample, de acuerdo con la programación orientada a la interfaz, necesitamos abstraer la muestra en una interfaz. Ahora la muestra es una interfaz, con dos subclases mySample y sample. Cuando queremos instanciarlos, como sigue:
La copia del código es la siguiente:
Muestra mySample = nuevo mySample ();
A medida que el proyecto se profundiza, la muestra puede "traer muchos hijos", por lo que necesitamos instanciar a estos hijos uno por uno. es inevitable en los programas tradicionales.
Pero si usa conscientemente el modelo de fábrica desde el principio, estos problemas se han ido.
Método de fábrica
Construirá una fábrica que se especialice en la producción de instancias de muestra:
La copia del código es la siguiente:
Factory de clase pública {
Public Static Sample Creator (int) {
// GetClass Genere la muestra En general, la carga de clase dinámica se puede usar para cargar clases.
if (que == 1)
devolver nuevo Samplea ();
más if (que == 2)
devolver nuevo sampleb ();
}
}
Luego, en su programa, si desea instanciar una muestra, use el código del código de copia de la siguiente manera:
Muestra muestlea = factory.creator (1);
De esta manera, la subclase específica de la muestra no está involucrada en todo el proceso. cuanto más fácil es cometer errores. Todos los que han hecho un trabajo específico tienen una comprensión profunda de esto. ¿Parece que también podemos entender los principios de la vida de la programación?
Utilice los métodos de fábrica para prestar atención a varios roles. Para generar la muestra del producto, como se muestra en la figura a continuación.
Para ser más complicado, es expandirse en la clase de fábrica, que también hereda su clase de implementación ConcreteFactory.
Abstracto de fábrica
El modelo de fábrica incluye: método de fábrica y fábrica abstracta.
La diferencia entre estos dos patrones está en la complejidad de la creación de objetos. Si nuestro método para crear un objeto se complica, como en el método de fábrica anterior, es crear una muestra de objeto, si tenemos una nueva interfaz de producto Sample2.
Suponiendo aquí: la muestra tiene dos clases de concreto muestreador y samleb, y sample2 también tiene dos clases de concreto sample2a y sampleb2. Implementación de la subclase de diferentes piezas, lo siguiente es expandir la fábrica en el ejemplo anterior en una fábrica abstracta:
La copia del código es la siguiente:
fábrica de clase pública abstracta {
Public Abstract Sample Creator ();
Public Abstract Sample2 Creator (nombre de cadena);
}
Clase pública SimpleFactory extiende la fábrica {
Public Sample Creator () {......... return New Samplea}
Public Sample2 Creator (nombre de cadena) {......... Devuelve una nueva muestra2a}
}
Class Public BombFactory extiende la fábrica {
Public Sample Creator () {...... return New SampleB}
Public Sample2 Creator (nombre de cadena) {...... return New Sample2b}
}
De lo anterior, las dos fábricas producen un conjunto de muestra y muestra2.
Hay otro punto clave en la fábrica abstracta, porque hay una cierta conexión entre los métodos que producen Sample y Sample2 en SimpleFactory, por lo que estos dos métodos deben inclinarse en una sola clase. El proceso está unificado, por ejemplo: el proceso de fabricación es relativamente simple, por lo que el nombre es SimpleFactory.
En aplicaciones prácticas, el método de fábrica se usa con mayor frecuencia, y se combina con cargadores de clase dinámicos.
Ejemplos de modelo de fábrica de Java
Tomemos el ForumFactory de Jive como ejemplo.
La copia del código es la siguiente:
Public Abstract Class ForumFactory {
objeto estático privado initlock = nuevo objeto ();
Public static forumFactory getInstance (autorización de autorización) {
// Si no se aprobó una autorización válida, return null.
if (autorización == nulo) {return null;
// lo siguiente usa el modo singleton singleton
if (factory == null) {
sincronizado (initlock) {
if (factory == null) {......
intentar {
// reimpresión dinámica
Clase C = class.forname (className);
fábrica = (ForumFactory) C.NewinStance ();
} Catch (excepción e) {return null;
}
}
}
// ahora, devuelve proxy.
devolver nuevo forumFactoryProxy (autorización, fábrica, fábrica.getpermissions (autorización));
}
// El método para crear foro se completa con una subclase heredadora ForumFactory.
Public Abstract Forum createForum (nombre de cadena, descripción de cadena)
lanza no autorizadoxception, foro dealreadyexistsexception;
....
}
Debido a que Jive ahora almacena publicaciones del foro y otros datos de contenido a través del sistema de bases de datos, si desea cambiarlo para implementarlo a través del sistema de archivos, este método de fábrica ForumFactory proporciona una interfaz dinámica:
La copia del código es la siguiente:
cadena estática privada classname = "com.jivesoftware.forum.database.dbforumFactory";
Puede usar el método que desarrolló para crear foro en lugar de com.jivesoftware.forum.database.dbforumFactory.
En el código anterior, hay tres modos. Foro de acceso: uno si usted es un usuario registrado y un invitado, entonces los permisos correspondientes serán diferentes, y este permiso se ejecuta a través de todo el sistema.
Echa un vistazo a Catalogdaofactory en Java Pet Store:
La copia del código es la siguiente:
CATALOGDAOFACTORY DE CLASE PÚBLICA {
/**
* Este método desarrolla una subclase especial para implementar el patrón DAO.
* La definición de subclase específica está en el descriptor de implementación J2EE.
*/
public static catalogdao getDao () lanza catalogdaosysexception {
Catalogdao catdao = nulo;
intentar {
InicialContext ic = new InitialContext ();
// Carga dinámica de catáloga_dao_class
// Puede definir su propio catálogo_dao_class, para que no necesite cambiar demasiado código
//, complete los enormes cambios en el sistema.
String className = (String) ic.lookup (jndinames.catalog_dao_class);
catdao = (catalogdao) class.forname (classname) .newinstance ();
} Catch (NamingException ne) {
Tire nuevo Catalogdaosysexception ("Catalogdaofactory.getdao: NamingException mientras obtiene el tipo DAO: /n" + ne.getMessage ());
} Catch (Exception SE) {
Tire nuevo catalogdaosysexception ("catalogdaofactory.getdao: excepción al obtener el tipo DAO: /n" + se.getMessage ());
}
regresar Catdao;
}
}
CatalogDaOfactory es un método de fábrica típico. . Implementar subclases y dar su propio nombre de subclase a la variable catalog_dao_class.
Se puede ver que el método de fábrica proporciona un mecanismo de expansión dinámico muy flexible y potente para la estructura del sistema. es posible cambiar las funciones del sistema en una transformación.