简单列一下这个模式的家族:
-
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
当你的才华还撑不起你的野心时,就应该静下心来学习;当你的能力还驾驭不了你的目标时,就应该沉下心来历练。梦想不是浮躁,而是沉淀和积累......
浙公网安备 33010602011771号