implementación sencilla de patrones de diseño Java (1) - Crear esquema

Artículo de referencia:

  1. En general: https: //www.cnblogs.com/adamjwh/p/9033545.html
  2. Singleton: https: //www.cnblogs.com/ygj0930/p/10845530.html

Crear un esquema dividido en lo siguiente.
Singleton (el Singleton) Modo: simultáneo multi-hilo para garantizar el acceso a un objeto y método, sólo una instancia de la operación de
prototipo (el prototipo) modo: un objeto como un prototipo, por su replicación y clonación de una pluralidad de similar y prototipo la nueva instancia.
método modo de fábrica (FactoryMethod): la definición de una interfaz de fábrica utilizado para crear el producto, la subclase produjolaProductos.
Modo Abstract Factory (AbstractFactory): crear una familia de productos de interfaces, cada subclase puede producirUna serie deproductos relacionados.
Builder (Constructor) Modo: un objeto complejoEn una pluralidad de porciones de relativamente simpleY luego crear de acuerdo a las diferentes necesidades de cada uno, y finalmente para construir los objetos complejos.

A, Singleton

  • Definiciones : Asegura patrón Singleton que sólo una instancia de una clase, y para instanciar el ejemplo para proporcionar todo el sistema. En un sistema informático, grupo de subprocesos, memoria caché, objeto de registro, el cuadro de diálogo, la impresora, los objetos controlador de gráficos se diseñan a menudo en una realización

  • Características :
    1): sólo una instancia de
    2): Usted debe crear su propia instancia única de
    3): Este ejemplo se facilitará a todos los demás objetos
    4):Además de método de construcción, el otro es estático

1. El perezoso (en el momento de la primera llamada instanciación propia)

public class Singleton{
	//将构造函数设置为私有,避免类在外部实例化
	private Singleton(){}
	//设置为静态,这样就可以每一次调用都是同一个对象
	private static Singleton single=null;
	public static Singleton getInstance(){
		//只有在没有实例的情况下才创建实例,保证只有一个实例
		if(single==null){
			single=new Singleton();
		}
		return single;
	} 
}

método de Singleton definido por el constructor de la clase se instancia evita externamente, una máquina virtual dentro de la misma gama, el único caso sólo se puede acceder Singleton getInstance () es privado.

(De hecho, a través del mecanismo de reflexión de Java puede crear una instancia de un constructor de clase es privado, hace que sustancialmente toda la realización de una sola prueba de Java. Este problema no se discute aquí, engañando tentativamente cree que la ausencia de reflexión .)

Pero para lograr el ejemplo anterior de un solo hilo flojo no tiene en cuenta las cuestiones de seguridad, no es seguro para subprocesos, instancias simultáneas ambiente Singleton es más probabilidades de lograr flujos seguros, hay tres formas, son la transformación de este método getInstance para asegurar que singleton del hombre perezoso flujos seguros, si primero Singleton contacto, hilo de seguridad no es muy comprensiva, puede saltarse los próximos tres tiras, ver los casos un hombre hambriento individuales, tales como ver detrás volver a considerar las cuestiones de seguridad hilo.

  1. Método de sincronización aplicado en getInstance
public static synchronized Singleton getInstance(){
	if(single == null){
		single=new Singleton();
	}
	return single;
}
  1. bloqueo de doble comprobado

A. Tenga en cuenta que los dos juicios nulo es un gran sentido del

  1. El primero es hacer un objeto nulo cada vez que crea sólo cuando está bloqueado
  2. El segundo es para evitar que el nulo juicio cuando dos subprocesos tienen acceso el método, en el primer método de depósito vacío, una entrada, un bloqueo, cuando el primer hilo libera el bloqueo después de la creación de la instancia, también entró en el segundo bloquear, también creada ejemplo situaciones.

II. En el caso de un objeto de allí la necesidad de añadir la palabra clave volátiles

  1. Aquí volátil si no se puede producir un error, es decir, cuando la lectura de códigos se determina a la declaración en la línea 11,Si la instancia no es nulo, pero la instancia del objeto de referencia puede no tener inicialización terminada, El hilo tendrá acceso al objeto no se ha inicializado. La razón es porque las primeras 14 líneas de código para crear un objeto, este código se puede descomponer en tres líneas de pseudo-código, es decir, asignar objeto de memoria, inicializar el objeto, la dirección de memoria simplemente asignado ejemplo puntos, se denominan como 1,2 3, entre 2 y 3 se pueden reordenar reordenación después de la inicialización se convierte en el paso final. Por lo tanto, hilo semántica intra-hilo A (todas las discusiones deben cumplir con la semántica intra-hilo cuando la ejecución de un programa Java, no va a cambiar el programa para asegurar que la reordenación de los resultados en el único subproceso) no ha cambiado, pero la reordenación de la A2 y A3 hacer que el hilo B se juzga que instancia no está vacío, el siguiente hilo para acceder a la instancia de objeto B caso mencionado, hilo B tendrá acceso al objeto no se ha inicializado. El retardo se puede lograr usando una inicialización volátil thread-safe,Cuando la naturaleza está prohibido por la reordenación de entre 2 y 3, para garantizar la seguridad de hilo inicialización perezosa.
public class Singleton {

    private volatile static Singleton instance;
    private static Object syncRoot = new Object();
    
    private Singleton() {
    }

    public static Singleton getInstance() {
        //双重锁定
        if(instance == null) {
            synchronized (syncRoot) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }
        
        return instance;
    }
    
}

  1. clases internas estáticas (ambos se dieron cuenta el hilo de seguridad, sino también para evitar el impacto en el rendimiento causado por la sincronización.)

El uso de la carga de clases para asegurar sólo una instancia crear una instancia
Desventajas: no se demore para crear objetos creados hará que el tiempo de inicialización se hace más largo cuando se carga la clase

public class Singleton {

    //静态内部类
    private static class SingletonHolder {
        public static Singleton instance = new Singleton();
    }
    
    private Singleton() {
    }
    
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
    
}

Ejemplo 2. hambrientos individual (en la clase de inicialización se crea una instancia por su cuenta)

Hambre clase de estilo chino, al mismo tiempo, ya creado creado un objeto estático utilizado por el sistema cambiará ya no, por lo que inherentemente seguro para subprocesos.

public class Singleton{
	private Singleton(){}
	//定义为final和static,无法修改
	private static final Singleton single = new Singleton().;
	public static Singleton getInstance(){
		return single;
	}
}

Desventaja de los cuatro métodos anteriores lograr una única forma de realización de

1. Cuando la forma de realización destruirá sola deserializado

No se llamará cuando se deserializa getXX método (), asegurando así logicsheets de derivación de realización, la generación directa de un objeto nuevo, la interrupción de una sola realización.

solución:

  1. método de clase override deserialización método devuelve el modo de realización solo deserializado, en lugar de crear un nuevo objeto.
public class Singleton implements Serializable{
	//当前实例
	public static Singleton INSTANCE = new Singleton();     
 
//双重锁定部分代码
	。。。

	//重写反序列化,使其直接返回当前实例
	   private Object readResolve() {     
            return INSTANCE;     
      }   
}
  1. constructor privado reescritura
//维护一个volatile的标志变量在第一次创建实例时置为false;重写构造函数,根据标志变量决定是否允许创建。
private static volatile  boolean  flag = true;
private Singleton(){
    if(flag){
    flag = false;   //第一次创建时,改变标志
    }else{
        throw new RuntimeException("The instance  already exists !");
    }

El mejor método de uso - el uso de un solo modo de enumeración Ejemplo

public enum singletonEnum{
	INSTANCE;
	private String name;
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
}

razón

  1. Acceso uso SingletonEnum.INSTANCE, ya no hay necesidad de definir los métodos y llame al método getInstance
  2. JVM ejemplo enumeración único, evitando la reflexión y deserialización mencionado anteriormente se produce la destrucción de realización individual, cada uno de la enumeración tipo definido enumerado y entonces la JVM es único.
    (Enumerado tipo de enumeración nombre de objeto atributo es de salida sólo cuando el resultado de la secuencia, el tiempo de deserialización es de acuerdo a los objetos enumerados por búsqueda de nombre método valueOf de java.lang.Enum)
  3. Nota: El compilador necesita para anular la prohibición enumerado writeObject tipo, readObject, readObjectNoData, writeReplace readResolve y otros métodos. )

modo de prototipo

  1. escena aplicable:
  • Entre los mismos o similares objetos, sólo unos pocos diferentes propiedades individuales cuando
  • Crear un objeto molesto, pero la copia de conveniencia
  1. Copia el objeto no está fuera del objeto original, el mismo valor de la propiedad, pero diferente objeto de dirección, puede crear un gran número de objetos similares.
  2. implementos de código (interfaz de línea de Cloneable implementado usando java)
//具体原型类
class A implements Cloneable{
	//写一个自定的构造方法,方便理解
	A(){
		System.out.println("具体原型创建成功");
	}
	public Object clone throws CloneNotSupportedException{
		System.out.println(“具体原型复制成功”);
		return (A)super.clone();
	}
}
//原型模式的测试类
public class B{
	 public static void main(String[] args)throws CloneNotSupportedException
    {
        A obj1=new A();
        A obj2=(A)obj1.clone();
        System.out.println("obj1==obj2?"+(obj1==obj2));
    }
}
  1. Los resultados son como sigue

el éxito de prototipos específicos!
prototipo específico éxito duplicado!
obj1 == obj2? falsa

patrón de la fábrica

  1. escena aplicable:
  • El otro lado no sé el nombre del producto específico, nombre del producto única planta de producción de clara
  • Crear un producto generado por el objeto en una planta específica, fábrica de resumen sólo es responsable de la creación de una interfaces de objetos
  • Los clientes sólo se preocupan por la marca, el producto no se preocupa por los detalles
  1. La estructura general
  • Abstract Factory: Proporcionar un método de interfaz para crear un objeto
  • Fábrica de concreto: crear objetos de aplicación, diferentes fábricas para crear objetos de diferentes productos
  • productos Resumen: especificaciones del producto que define, descripción de las características principales del producto
  • Productos específicos: Implementar el producto abstracto, creado por la planta específica, y la correspondencia específica de la planta.
  1. Modo de realización
/**
 *产品类
 **/
//抽象产品
interface product{
    public void show();
}
//具体产品1
class proA implements product{

    @Override
    public void show() {
        System.out.println("A");
    }
}
//具体产品2
class proB implements product{
    @Override
    public void show(){
        System.out.println("B");
    }
}

/**
 *工厂类
 **/
//抽象工厂
interface factory {
    product getPro();
}

//具体工厂1
class facA implements factory{
    @Override
    public product getPro(){
        return new proA();
    }
}

//具体工厂2
class facB implements factory {
    @Override
    public product getPro() {
        return new proB();
    }
}

Resumen patrón de fábrica

  1. Características: Cuando una fábrica específica no sólo producir un producto en particular
  2. Aplicación (clase de fábrica Modificar)
    ?????
    interfaz AbstractFactory
    {
    newProduct1 pública del producto1 es ();
    pública newProduct2 Producto2 es ();
    }

AbstractFactory ConcreteFactory1 la clase implementa
{
público del producto1 es newProduct1 ()
{
System.out.println ( "planta generadora DETALLADA 1 -> ... producto específico 11.");
Return new nueva ConcreteProduct11 ();
}
Producto2 pública es newProduct2 ()
{
System.out.println ( "planta de generación dETALLADA 1 -> ... producto específico es 21");
return new nueva ConcreteProduct21 ();
}
}
?????

modo constructor

  1. escena aplicable
  • Los objetos creados más compleja, hayUna pluralidad de componentesCada miembro del complejo variará, la construcción de un orden estable entre los miembros.
  • proceso de construcción y el producto final representa independiente cuando
  1. comprensión personal: que los diversos componentes de la realización del producto y el proceso de construcción segmentada y la construcción para lograr el fin,Cuando el proceso de construcción de un cambio de producto, los constructores sólo se necesita cambiar, y cuando hay un componente del cambio relativo del producto, para cambiar la realización concreta de componentes, cada uno por separado, y separa el constructor y el comandante, cuando la construcción cuando se cambia el proceso, solamente necesitamos cambiar el comandante, mientras que los detalles de la construcción de un proceso de cambio, necesidad de cambiar sólo los métodos de construcción específica puede constructor

  2. La estructura general

  • función del producto: contiene varios componentes de objetos complejos, es decir, para alcanzar los diversos componentes
  • constructor Resumen: contiene métodos abstractos para crear las subdivisiones del producto
  • constructor específica: implementa el constructor de interfaces abstractas
  • Commander: constructores de invocación de método completar la construcción de objetos complejos

Es similar al proceso de la construcción del edificio, construido por los trabajadores, que están dirigiendo los contratistas, contratistas de construcción a diferentes partes completas del edificio por cada ficha, completar la construcción de un edificio

  1. código de implementación
public class Abc {
    public static void main(String[] args) {
        //创建一个建造者
        ture_builder ture_builder=new ture_builder();
        //创建一个指挥者,并且给他建造者
        boss boss=new boss(ture_builder);
        product product=boss.build();
        System.out.println();
    }
}

//产品角色
class product{
    //部分1
    String pat1;
    String pat2;
    public void show(){
        System.out.println("aaa");
    };
}

//抽象建造者
abstract class builder{
    abstract void getpat1();
    abstract void getpat2();
    abstract product getres();
}

//具体建造者
class ture_builder extends builder{
    product pro1=new product();

    @Override
    void getpat1() {
        pro1.pat1="1";
        System.out.println("建造pat1部分");
    }

    @Override
    void getpat2() {
        pro1.pat2="2";
        System.out.println("建造pat2部分");
    }

    @Override
    product getres() {
        return pro1;
    }
}

//指挥者
class boss{
    private ture_builder ture_builder;
    
    boss(ture_builder ture_builder){
        this.ture_builder=ture_builder;
    }
    
    product build(){
        ture_builder.getpat1();
        ture_builder.getpat2();
        return ture_builder.getres();
    }
}
Publicado 36 artículos originales · ganado elogios 11 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/s_xchenzejian/article/details/103165193
Recomendado
Clasificación