工厂设计模式,应该是java中使用比较频繁的一个模式,其主要目的就是解决复杂的对象,就比如我建了一个水果罐头的加工工厂,可以生产,草莓罐头,苹果罐头,凤梨罐头,黄桃罐头(博主单单喜欢黄桃罐头,难道是因为跟黄字挂钩?),如果没有使用工厂模式,那我是不是要草莓,苹果,凤梨,黄桃这四种罐头各做一个流水线?我勒个去,我TM去哪整这么多钱?我是商人讲究的是效益,收益远远小于投入,我还整哪门子钱去????
于是我就开始思考,先从洗果池开始(我是个有良知的商人),预煮,冷却,玻璃瓶消毒/杀菌,灌装这几个步骤都是生产水果罐头必须的操作,那么我就可以省去很大一部分钱,然后可以拿着这些钱做些慈善事业(太君是不会亏待我们滴).
以上就是工厂模式的一个简单介绍,下边我们可以开始利用工厂模式做一个简单的示例了,首先我们需要创建一个整体的
第一 先要缕清思路 明确生产罐头共同的流程
1.洗果
2.预煮
3.冷却
4.玻璃瓶消毒/杀菌
5.灌装
第二 我们先要有个罐头流水线代码如下
/**
* 水果罐头
* @author Richair_Ann
*/
public abstract class FruitCan {
/**
* 清洗干净
*/
public abstract void toCleanClear();
/**
* 预煮
*/
public abstract void precook();
/**
* 冷却
*/
public abstract void cooling();
/**
* 消毒杀菌
*/
public abstract void killGerms();
/**
* 灌装
*/
public abstract void pouring();
}
第三 我们不可能每生产一瓶罐头就要创建一个流水线吧?为了省钱做慈善我也是费尽脑汁,我需要的就是我告诉你生产什么,你就可以立马动工,于是我将流水想抽取出来,就是下边这样
/**
* 某罐头的生产流水线
* @author Richair_Ann
*
*/
public abstract class FruitFactory {
/**
* 我不管怎么生产水果罐头,你只需要告诉我想生产什么罐头即可
* @param clz 具体的罐头类型
* @return 返回一个你想生产的罐头
*/
public abstract<T extends FruitCan> T createFruitCan(Class<T> clz);
}
第四 下边我只需要将我需要生产的某一个罐头继承它就可以,下边是这样的
/**
* 最后生产的罐头都大同小异,所以没必要一个一个的创建生产线,我只需要告诉你我要生产什么罐头你就可以给我做出来
*
* @author Richair_Ann
*
*/
public class FruitsFactory extends FruitFactory {
@Override
public <T extends FruitCan> T createFruitCan(Class<T> clz) {
FruitCan fruitCan = null;
try {
fruitCan = (FruitCan) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) fruitCan;
}
}
下边我想生产草莓罐头和黄桃罐头 分别创建一个搭建一个流水线,只需要继承FruitCan即可
/**
* 草莓
*
* @author Richair_Ann
*
*/
public class Berries extends FruitCan {
@Override
public void toCleanClear() {
System.out.println("开始清洗草莓");
}
@Override
public void precook() {
System.out.println("开始预煮草莓");
}
@Override
public void cooling() {
System.out.println("将草莓冷却");
}
@Override
public void killGerms() {
System.out.println("对玻璃瓶进行杀菌消毒");
}
@Override
public void pouring() {
System.out.println("对草莓进行灌装");
}
}
/**
* 黄桃
*
* @author Richair_Ann
*
*/
public class YellowPeaches extends FruitCan {
@Override
public void toCleanClear() {
System.out.println("开始清洗黄桃");
}
@Override
public void precook() {
System.out.println("开始预煮黄桃");
}
@Override
public void cooling() {
System.out.println("将黄桃冷却");
}
@Override
public void killGerms() {
System.out.println("对玻璃瓶进行杀菌消毒");
}
@Override
public void pouring() {
System.out.println("对黄桃进行灌装");
}
}
下边开始测试
/**
* 测试
*
* @author Richair_Ann
*
*/
public class Test {
public static void main(String[] args) {
FruitsFactory factory = new FruitsFactory();
Berries berries = factory.createFruitCan(Berries.class);
berries.toCleanClear();
berries.precook();
berries.cooling();
berries.killGerms();
berries.pouring();
System.out.println("-----------------------------");
YellowPeaches yellowPeaches = factory.createFruitCan(YellowPeaches.class);
yellowPeaches.toCleanClear();
yellowPeaches.precook();
yellowPeaches.cooling();
yellowPeaches.killGerms();
yellowPeaches.pouring();
}
}
总结:工厂设计模式确实解决了不少重复性的工作,使得代码简洁了很多,但是也同样有它的确定,那就是我们每次创建新产品时都要编写新的产品类,还要引入抽象层,是代码结构过于复杂,在使用的时候需要我们权衡利弊,自行甄别使用!