Patrón de diseño de prototipo (prototipo): producción rápida de automóviles

Construye autos rápidamente - modo prototipo

¿Qué hacer si estás cansado de producir un automóvil?

La última vez, presentamos el modo de fábrica (Factory), es decir, el usuario puede producir y devolver por la fábrica al proporcionar información específica del modelo.

Más tarde, se descubrió que había cada vez menos clientes, la fábrica no podía llegar a fin de mes e incluso recibió quejas, la reputación era extremadamente mala y estuvo a punto de romper la puerta y cerrar ¿Por qué? Ao, resulta que la fábrica es demasiado lenta para producir autos. El gran patrón quiere 100 Rolls Royces de repente. Nuestros trabajadores siguen comenzando de cero, comprando piezas, ensamblando llantas, ensamblando carrocerías, ensamblando motores...

Ingeniero senior para ayudar

El ensamblaje fue demasiado lento. En este momento, el ingeniero senior pensó, si tenemos un Rolls-Royce en este momento, sería genial poder copiar nuevos Rolls-Royce continuamente , pero la copia debe ser nueva , y luego continúe diseñando y agregando atributos, ensamblaje , esta es la interfaz clonable del arma mágica del ingeniero senior , siempre que sea una clase que implemente esta interfaz, ¡puede copiar el mismo automóvil Rolls-Royce nuevo ! ! Pronto, la fábrica volvió a levantarse y el ingeniero superior también fue ascendido a ingeniero superior~~~

¡Jajaja, esta es la abstracción concreta del patrón prototipo en el patrón de diseño! ! !

El arma mágica de los altos ingenieros (implementando el modo prototipo)

Magia gráfica (modo prototipo)

inserte la descripción de la imagen aquí

En este punto, el problema se vuelve claro, necesitamos guardar la fábrica de esta manera:

  1. Diseñemos un modelo Además de todos los procesos de producción para diseñar este modelo, necesitamos implementar la interfaz Cloneable y anular el método clone() para esta clase de modelo.
  2. ¡Al producir un automóvil nuevo, solo necesita llamar al método clone () del modelo creado para construir un automóvil nuevo! ! !

Implementación concreta inicial de alto ingeniero (copia superficial)

Modelos de Rolls Royce

package com.design_patterns.prototype.instance;


import com.design_patterns.factory.instance.Car;

public class RollsRoyce implements Car, Cloneable {
    
    
    private String tirName = null;                  //轮胎型号
    private String bodyName = null;             //车身型号
    private String engineName = null;               //发动机型号
    private Information information = null;         //劳斯莱斯车的信息类对象

    public String getTirName() {
    
    
        return tirName;
    }

    public void setTirName(String tirName) {
    
    
        this.tirName = tirName;
    }

    public String getBodyName() {
    
    
        return bodyName;
    }

    public void setBodyName(String bodyName) {
    
    
        this.bodyName = bodyName;
    }

    public String getEngineName() {
    
    
        return engineName;
    }

    public void setEngineName(String engineName) {
    
    
        this.engineName = engineName;
    }

    public Information getInformation() {
    
    
        return information;
    }

    public void setInformation(Information information) {
    
    
        this.information = information;
    }

    @Override
    public void produce() {
    
    
        System.out.println("劳斯莱斯车生产成功!");
    }

    /**
     * 覆写劳斯莱斯车的拷贝方法,默认为父类的clone方法
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
    
    
        return super.clone();
    }

    @Override
    public String toString() {
    
    
        return "RollsRoyce{" +
                "tirName='" + tirName + '\'' +
                ", bodyName='" + bodyName + '\'' +
                ", engineName='" + engineName + '\'' +
                ", information=" + information +
                '}';
    }
}

Información de clase de información de producción de Rolls-Royce Información (indica el número de automóviles)

package com.design_patterns.prototype.instance;

public class Information {
    
    
    private static int amount = 0;              //劳斯莱斯车的生产数量
    public Information(){
    
    
        amount++;
    }

    public static int getAmount() {
    
    
        return amount;
    }

    public static void setAmount(int amount) {
    
    
        Information.amount = amount;
    }

    @Override
    public String toString() {
    
    
        return "劳斯莱斯@num" + amount;
    }
}

Clase de prueba de operación de producción

package com.design_patterns.prototype.instance;

public class Client {
    
    
    public static void main(String[] args) throws Exception{
    
    
        RollsRoyce rollsRoyce = new RollsRoyce();
        rollsRoyce.setTirName("劳斯莱斯轮胎");                //制造轮胎
        rollsRoyce.setBodyName("劳斯莱斯车身");                //制造车身
        rollsRoyce.setEngineName("劳斯莱斯发动机");                  //制造发动机
        rollsRoyce.produce();                           //制造汽车,此为汽车的制作全部过程
        rollsRoyce.setInformation(new Information());

        System.out.println("样本车产生---->" + rollsRoyce + "\n");

        int num = 50;
        RollsRoyce rollsRoyce1 = null;
        while (num > 0){
    
                                                        //生产50辆劳斯莱斯车
            rollsRoyce1 = (RollsRoyce) rollsRoyce.clone();
            System.out.println(rollsRoyce1);
            System.out.println("生产编号: " + rollsRoyce1.hashCode());
            num--;
        }
    }
}

resultado de la operación

劳斯莱斯车生产成功!
样本车产生---->RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}

RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 1163157884
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 1956725890
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 356573597
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 1735600054
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 21685669
......
由于生产50台,数据过多暂列举一部分,生产编号均不同

Wow, en este momento descubrimos que exactamente los mismos 50 Rolls-Royce también se produjeron casi instantáneamente, y no hay necesidad de trabajar duro en la producción de juegos, juegos y juegos, y la eficiencia de producción ha mejorado mucho, simplemente como el jefe Cuando el cliente está muy contento.

El ingeniero senior le dijo al jefe que estos 50 Rolls-Royces no se pueden vender. Para el desarrollo positivo de la fábrica en el futuro, deben ser destruidos. ¿Por qué? En este momento, noté que las ventanas de vidrio de los autos Rolls-Royce están impresas uniformemente con una línea de caracteres pequeños: información: Rolls-Royce@num1, ¿por qué los números de modelo son todos 1? Está claramente determinado que la cuenta se acumulará cuando se ejemplifique la clase de información.

En este momento, el ingeniero senior dijo que, de hecho, solo tenemos una instancia de Información. Usamos una copia superficial cuando copiamos un automóvil Rolls-Royce , y la clase de información es un tipo de datos de referencia . La copia superficial solo puede apuntar el valor del nuevo tipo de datos de referencia a la dirección de los datos de referencia originales y no se puede reproducir. (nuevo) se refiere al tipo de datos. Si también desea producir (nueva) información de tipo de datos de referencia, debe mejorar el método clone () predominante , el ingeniero senior dio la solución ...

nueva solución

El ingeniero senior dio el plan de orientación, que (clase RollsRoyce):

@Override
protected Object clone() throws CloneNotSupportedException {
     
     
    return super.clone();
}

mejorado a

@Override
protected Object clone() throws CloneNotSupportedException {
     
     
    RollsRoyce rollsRoyce = (RollsRoyce) super.clone();
    rollsRoyce.information = new Information();            //实例化一个新的Information类对象
    return rollsRoyce;                                  //返回深拷贝后的劳斯莱斯车对象
}

Esto produce la información de clase Información de Rolls-Royce, nuevamente ejecutando la operación de producción de Rolls-Royce...

resultado de la operación

劳斯莱斯车生产成功!
样本车产生---->RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}

RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num2}
生产编号: 1163157884
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num3}
生产编号: 1956725890
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num4}
生产编号: 356573597
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num5}
生产编号: 1735600054
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num6}
生产编号: 21685669
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num7}
生产编号: 2133927002
RollsRoyce{
    
    tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num8}
生产编号: 1836019240
......
由于生产50台,数据过多暂列举一部分,生产编号均不同,information属性也不同

Resumir

Solo un capricho, jejeje, esta es la primera vez que uso este ejemplo para escribir notas. No sé si el efecto es bueno o no. De hecho, este capítulo también introduce brevemente el uso básico del modo prototipo, así como copia superficial, copia profunda y sugerencias de copia profunda Implementado mediante serialización de objetos ( este artículo tiene un método para serializar copias profundas ).

Si tus amigos sienten que la escritura no es mala, por favor dale me gusta, jeje, si sientes que la escritura no es buena, envíame un mensaje privado, puedo corregirlo, ¡vamos!

Un ingeniero senior ha sido ascendido a ingeniero senior, ¿cuánto tiempo le faltará?

Supongo que te gusta

Origin blog.csdn.net/weixin_43479947/article/details/107468497
Recomendado
Clasificación