1、静态工厂模式
2、简单工厂模式
3、工厂方法模式
4、抽象工厂模式
1、静态工厂模式:
例如项目中的工具类,TextUtil.isEmpty等,类+静态方法;实例:略。
2、简单工厂模式:
这是一个非常简单的例子,例子的创意来源于我的偶像鸿洋的博客(代码都是我手写的),我们现在要做一个加工肉夹馍的例子让大家感受一下工厂模式,下面让我们一起分析一下:
(在这里我们一共有六个类,分别是肉夹馍的销售类,肉夹馍类,还有三种口味的肉夹馍类,还有一个测试类)
RoujiaMoStore.java:
<span style="font-size:18px;">/*
* @author lin_sir;
* date:2016-1-31
*/
public class RoujiaMoStore {
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;
}
}
</span>
RouJiaMo.java:
<span style="font-size:18px;">/*
* @author lin_sir;
* date:2016-1-31
*/
public class RouJiaMo {
protected String name;
public void prepare() {
System.out.println("揉面-剁肉-完成准备工作");
}
public void pack() {
System.out.println("肉夹馍-专用袋-包装");
}
public void fire() {
System.out.println("肉夹馍-专用设备-烘烤");
}
}</span>
LaRoujiaMo.java:
<span style="font-size:18px;">/*
* @author lin_sir;
* date:2016-1-31
*/
public class LaRoujiaMo extends RouJiaMo {
public LaRoujiaMo() {
this.name = "辣肉夹馍";
System.out.println("我是辣肉夹馍");
}
}</span>
SuanRoujiaMo.java:
<span style="font-size:18px;">/*
* @author lin_sir;
* date:2016-1-31
*/
public class SuanRoujiaMo extends RouJiaMo {
public SuanRoujiaMo() {
this.name = "酸肉夹馍";
System.out.println("我是酸肉夹馍");
}
}</span>
TianRouJiaMo.java:
<span style="font-size:18px;">/*
* @author lin_sir;
* date:2016-1-31
*/
public class TianRouJiaMo extends RouJiaMo {
public TianRouJiaMo() {
this.name = "甜肉夹馍";
System.out.println("我是甜肉夹馍");
}
}
</span>
Test.java:
<span style="font-size:18px;">/*
* @author lin_sir;
* date:2016-1-31
*/
public class Test {
public static void main(String[] args) {
RoujiaMoStore r1 = new RoujiaMoStore();
r1.sellRouJiaMo("Tian");
}
}
</span>
这样我们的销售肉夹馍的整个工程就写完了,但是这里了我们的销售方法里面的方法和我们的肉夹馍的种类耦合度太高了,无论是增加一种新的肉夹馍的方法,还是删除一种肉夹馍的方式,都需要修改store里面的代码的,我认为这样很不好的,所以在这里我们需要增加我们的工厂的概念了,所以我们作了如下的举动,这也就让我们的简单的工厂模式派上用场了。
SimpleRouJiaMoFactory.java:
<span style="font-size:18px;">/*
* @author lin_sir;
* date:2016-1-31
*/
public class SimpleRouJiaMoFactory {
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();
}
rouJiaMo.prepare();
rouJiaMo.fire();
rouJiaMo.pack();
return rouJiaMo;
}
}
</span>
<span style="font-size:18px;">/*
* @author lin_sir;
* date:2016-1-31
*/
public class RoujiaMoStore {
private SimpleRouJiaMoFactory factory;
public RoujiaMoStore(SimpleRouJiaMoFactory factory) {
this.factory = factory;
}
public RouJiaMo sellRoujiaMo(String type) {
RouJiaMo rouJiaMo = factory.createRouJiaMo(type);
rouJiaMo.prepare();
rouJiaMo.fire();
rouJiaMo.pack();
return rouJiaMo;
}
}
</span>
通过以上的改动,我们的简单的工厂模式也就成型了。
3、工厂方法模式:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。//TODO
4、抽象工厂模式:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。//TODO