2. El modelo de fábrica comienza con la venta de carne.

Enumere brevemente las familias de este modelo:

1. Modo de fábrica estático

2. Modelo de fábrica simple

3. Patrón de método de fábrica

4. Modelo de fábrica abstracto

No creas, déjame ir, esta fábrica puede enumerar tantas categorías, jaja, analicemos cada una a continuación.

1. Modo de fábrica estático

Esta es la clase auxiliar más común en el proyecto, TextUtil.isEmpty, etc., clase + método estático. Comencemos con una introducción detallada: Omitido.

2. Modelo de fábrica simple

Ahora hablemos de vender albóndigas de carne. Recientemente, los programadores que venden albóndigas de carne son muy populares. Cuando las grandes vacas las vendan, me levantaré pronto, jaja.

Primero que nada tienes que tener una tienda: RoujiaMoStore

package com.zhy.pattern.factory.a;
 
public class RoujiaMoStore
{
 
	/**
	 * 根据传入类型卖不同的肉夹馍
	 * 
	 * @param type
	 * @return
	 */
	public RouJiaMo sellRouJiaMo(String type)
	{
		RouJiaMo rouJiaMo = null;
		
		if (type.equals("Suan"))
		{
			rouJiaMo = new SuanRouJiaMo();
 
		} else if (type.equals("Tian"))
		{
			rouJiaMo = new TianRouJiaMo();
		} else if (type.equals("La"))
		{
			rouJiaMo = new LaRouJiaMo();
		}
		
		rouJiaMo.prepare();
		rouJiaMo.fire();
		rouJiaMo.pack();
		return rouJiaMo;
	}
 
}

Entonces tienes que tener varios sabores de bollos:

package com.zhy.pattern.factory.a;
 
public abstract class RouJiaMo
{
	protected String name;
 
	/**
	 * 准备工作
	 */
	public void prepare()
	{
		System.out.println("揉面-剁肉-完成准备工作");
	}
 
	/**
	 * 使用你们的专用袋-包装
	 */
	public void pack()
	{
		System.out.println("肉夹馍-专用袋-包装");
	}
	/**
	 * 秘制设备-烘烤2分钟
	 */
	public void fire()
	{
		System.out.println("肉夹馍-专用设备-烘烤");
	}
}
package com.zhy.pattern.factory.a;
 
import com.zhy.pattern.factory.a.RouJiaMo;
 
/**
 * 辣味肉夹馍
 * 
 * @author zhy
 * 
 */
public class LaRouJiaMo extends RouJiaMo
{
	public LaRouJiaMo()
	{
		this.name = "辣味肉夹馍";
	}
}
package com.zhy.pattern.factory.a;

/**
 * 酸味肉夹馍
 * 
 * @author zhy
 * 
 */
public class SuanRouJiaMo extends RouJiaMo
{
	public SuanRouJiaMo()
	{
		this.name = "酸味肉夹馍";
	}
}
package com.zhy.pattern.factory.a;
 
 
 
/**
 * 酸味肉夹馍
 * 
 * @author zhy
 * 
 */
public class SuanRouJiaMo extends RouJiaMo
{
	public SuanRouJiaMo()
	{
		this.name = "酸味肉夹馍";
	}
}

El diseño actual, aunque puede ayudarte a vender pinzas para carne, es un poco problemático. El tipo de bollos al vapor y tu RoujiaMoStore están demasiado acoplados. Si agregas varios sabores o eliminas varios sabores, tienes que modificar el sellRouJiaMo todo el tiempo. Por lo tanto, necesitamos hacer ciertas modificaciones, y el modelo simple de fábrica puede ser útil.
Comenzamos a escribir una fábrica simple para llevar a cabo el proceso de producción de bollos:

package com.zhy.pattern.factory.a;
 
public class SimpleRouJiaMoFactroy
{
	public RouJiaMo createRouJiaMo(String type)
	{
		RouJiaMo rouJiaMo = null;
		if (type.equals("Suan"))
		{
			rouJiaMo = new SuanRouJiaMo();
 
		} else if (type.equals("Tian"))
		{
			rouJiaMo = new TianRouJiaMo();
		} else if (type.equals("La"))
		{
			rouJiaMo = new LaRouJiaMo();
		}
		return rouJiaMo;
	}
 
}

Luego, deje que la Tienda lo use en combinación:

package com.zhy.pattern.factory.a;
 
public class RoujiaMoStore
{
	private SimpleRouJiaMoFactroy factroy;
 
	public RoujiaMoStore(SimpleRouJiaMoFactroy factroy)
	{
		this.factroy = factroy;
	}
 
	/**
	 * 根据传入类型卖不同的肉夹馍
	 * 
	 * @param type
	 * @return
	 */
	public RouJiaMo sellRouJiaMo(String type)
	{
		RouJiaMo rouJiaMo = factroy.createRouJiaMo(type);
		rouJiaMo.prepare();
		rouJiaMo.fire();
		rouJiaMo.pack();
		return rouJiaMo;
	}
 
}

Bien, ahora puedes agregar los tipos de bollos que quieras, y los tipos de bollos que elimines no tienen nada que ver con la Tienda. ¿ Alguien solo vende bollos? Este es un modelo simple de fábrica. Por supuesto, todos están familiarizados con él.
3. Patrón de método de fábrica

Definición: Defina una interfaz para crear objetos, pero la subclase decide qué clase instanciar. El patrón del método de fábrica difiere el proceso de instanciación de clases a subclases.

Bien, después de leer la definición, usemos un ejemplo para mostrarlo. Continuando con Roujiamo, debido al modelo de fábrica simple, el negocio de Roujiamo es bueno, por lo que Download decidió abrir una sucursal en Xi'an y una sucursal en Beijing. Dado que hay sucursales, la oficina central es abstracta:

package com.zhy.pattern.factory.b;
 
public abstract class RoujiaMoStore
{
 
	public abstract RouJiaMo createRouJiaMo(String type);
 
	/**
	 * 根据传入类型卖不同的肉夹馍
	 * 
	 * @param type
	 * @return
	 */
	public RouJiaMo sellRouJiaMo(String type)
	{
		RouJiaMo rouJiaMo = createRouJiaMo(type);
		rouJiaMo.prepare();
		rouJiaMo.fire();
		rouJiaMo.pack();
		return rouJiaMo;
	}
 
}

Luego abra dos ramas, aquí hay un código para demostrar, las otras son iguales:

package com.zhy.pattern.factory.b;

/**
 * 西安肉夹馍店
 * 
 * @author zhy
 * 
 */
public class XianRouJiaMoStore extends RoujiaMoStore
{
 
	@Override
	public RouJiaMo createRouJiaMo(String type)
	{
		RouJiaMo rouJiaMo = null;
		if (type.equals("Suan"))
		{
			rouJiaMo = new XianSuanRouJiaMo();
 
		} else if (type.equals("Tian"))
		{
			rouJiaMo = new XianTianRouJiaMo();
		} else if (type.equals("La"))
		{
			rouJiaMo = new XianLaRouJiaMo();
		}
		return rouJiaMo;
 
	}
 
}

Luego hay todo tipo de sándwiches de carne con sabor a Xi'an, este código no se publicará. Se puede ver que dejamos que la subclase decida el proceso de hacer RouJiaMo en la forma de un método abstracto Compare la definición:
1. Defina una interfaz para crear objetos: public abstract RouJiaMo createRouJiaMo (tipo String);

2. La subclase determina la clase instanciada, y podemos ver que nuestro bollo es generado por la subclase.

Algunas personas pueden decir que puedo usar un modelo de fábrica simple, pero si hay 10 ciudades * 5 sabores / ciudad, entonces ¿significa que hay más de 50 ifs en la fábrica simple, y la sucursal de Xi'an Roujiamo no puede ser un poco propia? El secreto es, por supuesto, lo mejor para él.

Bueno, la introducción del patrón de fábrica de métodos está completa.

4. Modelo de fábrica abstracto

Definición: Proporcione una interfaz para crear familias de objetos relacionados o dependientes sin especificar clases específicas explícitamente.

Esta definición es un poco complicada. Olvídalo, pongamos un ejemplo. Seguimos vendiendo albóndigas de carne, nuestro negocio es tan bueno, es inevitable que algunas sucursales empiecen a usar carne de calidad inferior, etc., y destrocen nuestra marca. Por lo tanto, tenemos que tomar el dinero para establecer nuestras propias granjas de materias primas en cada ciudad para asegurar el suministro de materias primas de alta calidad.

Entonces creamos una nueva interfaz para proporcionar materias primas:

package com.zhy.pattern.factory.b;
 
/**
 * 提供肉夹馍的原料
 * @author zhy
 *
 */
public interface RouJiaMoYLFactroy
{
	/**
	 * 生产肉
	 * @return
	 */
	public Meat createMeat();
	
	/**
	 * 生产调料神马的
	 * @return
	 */
	public YuanLiao createYuanliao();
	
}
package com.zhy.pattern.factory.b;
 
/**
 * 根据西安当地特色,提供这两种材料
 * @author zhy
 *
 */
public class XianRouJiaMoYLFactroy implements RouJiaMoYLFactroy
{
 
	@Override
	public Meat createMeat()
	{
		return new FreshMest();
	}
 
	@Override
	public YuanLiao createYuanliao()
	{
		return new XianTeSeYuanliao();
	}
 
}

Con la fábrica de principios, modifiquemos ligeramente el método de preparación de RouJiaMo:

package com.zhy.pattern.factory.b;
 
public abstract class RouJiaMo
{
	protected String name;
 
	/**
	 * 准备工作
	 */
	public final void prepare(RouJiaMoYLFactroy ylFactroy)
	{
		Meat meat = ylFactroy.createMeat();
		YuanLiao yuanliao = ylFactroy.createYuanliao();
		System.out.println("使用官方的原料" + meat + " , " + yuanliao + "作为原材料制作肉夹馍 ");
	}
 
	/**
	 * 使用你们的专用袋-包装
	 */
	public final void pack()
	{
		System.out.println("肉夹馍-专用袋-包装");
	}
 
	/**
	 * 秘制设备-烘烤2分钟
	 */
	public final void fire()
	{
		System.out.println("肉夹馍-专用设备-烘烤");
	}
}

Bueno, ahora debemos utilizar nuestras materias primas oficiales como materias primas.
Ahora compare las definiciones:

1. Proporcionar una interfaz: interfaz pública RouJiaMoYLFactroy

2. Se utiliza para crear una familia de objetos relacionados o dependientes public Meat createMeat (); public YuanLiao createYuanliao (); Nuestra interfaz se utiliza para crear una serie de materias primas.

De acuerdo, para la prueba final, voy a comprar un sabor amargo en la tienda de Xi’an Moo:

package com.zhy.pattern.factory.b;
 
 
public class Test
{
	public static void main(String[] args)
	{
		
		RoujiaMoStore roujiaMoStore = new XianRouJiaMoStore();
		RouJiaMo suanRoujiaMo = roujiaMoStore.sellRouJiaMo("Suan");
		System.out.println(suanRoujiaMo.name);
	}
}
使用官方的原料com.zhy.pattern.factory.b.FreshMest@e53108 , com.zhy.pattern.factory.b.XianTeSeYuanliao@f62373作为原材料制作肉夹馍 
肉夹馍-专用设备-烘烤
肉夹馍-专用袋-包装
酸味肉夹馍

Supongo que te gusta

Origin blog.csdn.net/GTC_GZ/article/details/108741765
Recomendado
Clasificación