简单介绍
此模式本质还是一个创建型的模式,其意义创建一个对象工厂接口,将实际的创建工作交由子类创建,核心工厂类不再关注类的创建过程,而关心子类工厂共有的必须实现的接口。
此模式要素
要想实现工厂方法模式,我们需要的要素有:
首先要有具体的角色,即具体的实例(菜肴)。
要有共同的抽象(锅碗瓢盆)。
及具体的工厂(饭店)。
还有抽象工厂(餐饮公司)。
这么一大段话,什么意思呢?
接着简单工厂模式聊(没看过的朋友可以阅读一下)
本人之前找到了一家能够满足我所有口味的饭店,相当满足,但是有一天,我的口味发生了变化,而饭店做不到,我生气了,和饭店一刀两断(这是简单工厂模式的弊端,和我的文章对应)。多年后,我富甲一方(西虹市首富),我一气之下,成立了餐饮公司(这就是抽象工厂),餐饮公司旗下有川菜馆和鲁菜馆(这就是具体的工厂),合我的口味,这些菜馆里面都有为我生财的工具,锅碗瓢盆(共同的抽象),这两家饭馆能做出我想吃的菜(具体的实例)
突然有一天,我想吃粤菜,没办法,有钱,不想去别家吃,餐饮公司旗下多了一家饭馆,粤菜馆(具体的工厂’粤菜馆’继承自抽象工厂’餐饮公司’,有共同的抽象’锅碗瓢盆’),于是我又美滋滋的吃到了粤菜。
比简单工厂模式好在哪?
工厂方法模式核心是工厂抽象类
简单工厂模式核心是工厂类
当我们的系统需要有新的对象支撑业务时,只需要添加具体的对象和对象对应的工厂即可,对原有的对象及工厂没有任何修改,这符合了我们做软件的一个原则,”开放-封闭”原则,对扩展是开发的,对修改是封闭的。
而简单工厂模式在添加新的对象后不得不修改工厂的方法,扩展性不好,违反”开放-封闭”原则。
实现代码演进
代码可在码云中下载(包名为b_factoryMethod)
https://gitee.com/XiaoSa12138/java-models
实现(好处在后面)
/**
* 饭店肯定是用一套锅碗瓢盆(共同的抽象)
*/
public interface Cai {
void get();
}
/**
* 川菜
*/
public class ChuanCai implements Cai {
public void get(){
System.out.println("麻婆豆腐.....");
}
}
/**
* 鲁菜
*/
public class LuCai implements Cai {
public void get(){
System.out.println("糖醋鲤鱼.....");
}
}
/**
* 工厂抽象类(就是餐饮公司)
*/
public interface CaiFactory {
Cai getCai();
}
/**
* 川菜工厂类(川菜馆)
*/
public class ChuanCaiFactory implements CaiFactory {
public Cai getCai() {
return new ChuanCai();
}
}
/**
* 鲁菜工厂类(鲁菜馆)
*/
public class LuCaiFactory implements CaiFactory {
public Cai getCai() {
return new LuCai();
}
}
/**
* 主类
*/
public class Main {
//告诉餐饮公司需要什么菜,公司就去旗下对应的菜馆做就可以了
public static void main(String[] args) {
CaiFactory chuanF = new ChuanCaiFactory();
Cai chuanCai = chuanF.getCai();
chuanCai.get();
CaiFactory luF = new LuCaiFactory();
Cai luCai = luF.getCai();
luCai.get();
}
}
这时候,好处就来了,想吃粤菜,餐饮公司有钱就行了,我不再操心
/**
* 粤菜
*/
public class YueCai implements Cai {
public void get(){
System.out.println("烧鹅.....");
}
}
/**
* 粤菜工厂类(粤菜馆)
*/
public class YueCaiFactory implements CaiFactory {
public Cai getCai() {
return new YueCai();
}
}
/**
* 主类修改
*/
public class Main {
//告诉餐饮公司需要什么菜,公司就去旗下的菜馆做就可以了,对之前的川菜和鲁菜馆没影响
public static void main(String[] args) {
CaiFactory chuanF = new ChuanCaiFactory();
Cai chuanCai = chuanF.getCai();
chuanCai.get();
CaiFactory luF = new LuCaiFactory();
Cai luCai = luF.getCai();
luCai.get();
//扩展性
CaiFactory YueF = new YueCaiFactory();
Cai yueCai = YueF.getCai();
yueCai.get();
}
}