设计模式---工厂模式

Posted on 2019-10-02 00:16  苏雅雷斯7988  阅读(123)  评论(0)    收藏  举报

简单列一下这个模式的家族:

  • 1、静态工厂模式

    • 这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。
  • 2、简单工厂模式(店里买肉夹馍)

    • 定义:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
    • 根据类型直接创建肉夹馍:SimpleRoujiaMoFactory.java
    public RoujiaMo creatRoujiaMo(String type) {
        RoujiaMo roujiaMo = null;
        switch (type) {
            case "Suan":
                roujiaMo = new ZSuanRoujiaMo();
                break;
            case "La":
                roujiaMo = new ZLaRoujiaMo();
                break;
            case "Tian":
                roujiaMo = new ZTianRoujiaMo();
                break;
            default:// 默认为酸肉夹馍
                roujiaMo = new ZSuanRoujiaMo();
                break;
        }
        return roujiaMo;
    }
    
  • 3、工厂方法模式(开分店)

    • 定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。
    • 对比定义:
      • 1、定义了创建对象的一个接口:public abstract RouJiaMo sellRoujiaMo(String type);
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;
	}
 
}
 - 2、由子类决定实例化的类,可以看到我们的馍是子类生成的。
  • 提供创建肉夹馍店抽象方法:RoujiaMoStore.java

    	public abstract RoujiaMo sellRoujiaMo(String type);
    
  • 具体实现抽象方法:[XianRoujiaMoStore.java]

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;
 
	}
 
}

  • 分店依旧使用简单工厂模式:XianSimpleRoujiaMoFactory.java

  • 4、抽象工厂模式(使用官方提供的原料)

    • 定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。
    • 对比定义:
      • 1、提供一个接口:public interface RouJiaMoYLFactroy
/**
 * 提供肉夹馍的原料
 *
 */
public interface RouJiaMoYLFactroy
{
	/**
	 * 生产肉
	 * @return
	 */
	public Meat createMeat();
	
	/**
	 * 生产调料神马的
	 * @return
	 */
	public YuanLiao createYuanliao();
	
}
/**
 * 根据西安当地特色,提供这两种材料
 * @author zhy
 *
 */
public class XianRouJiaMoYLFactroy implements RouJiaMoYLFactroy
{
 
	@Override
	public Meat createMeat()
	{
		return new FreshMest();
	}
 
	@Override
	public YuanLiao createYuanliao()
	{
		return new XianTeSeYuanliao();
	}
 
}


 	- 2、用于创建相关的或依赖对象的家族 public Meat createMeat();public YuanLiao createYuanliao();我们接口用于创建一系列的原材料。
 - 创建用于提供原料的接口工厂:[RoujiaMoYLFactory.java]
 - 各自分店实现接口,完成原料提供:[XianRoujiaMoYLFoctory.java]
 - 准备时,使用官方的原料:[RoujiaMo.java]

有了原理工厂,那我们稍微修改下RouJiaMo的prepare方法:

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("肉夹馍-专用设备-烘烤");
	}
}

最后测试下,我要在西安馍店,买个酸味的尝尝:

public class Test
{
	public static void main(String[] args)
	{
		
		RoujiaMoStore roujiaMoStore = new XianRouJiaMoStore();
		RouJiaMo suanRoujiaMo = roujiaMoStore.sellRouJiaMo("Suan");
		System.out.println(suanRoujiaMo.name);
	}
}

最后的抽象工厂模式可以参考下面的链接:
https://www.yiibai.com/design_pattern/abstract_factory_pattern.html

转载至:https://github.com/youlookwhat/DesignPattern

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3