简单工厂:
interface IPeople{}
public class Man implements IPeople{}
public class Woman implements IPeople{}
public class PeopleFactory1{
private IPeople p;
public static IPeople createWoman(){
return new Woman();
}
public static IPeople createMan(){
return Man();
}
}
//或者通过参数来判断是否传出来的对象
public class PeopleFactory2{
public static IPeople createPeople(String args){
IPeople p = null;
switch(args){
case "man":
p = new Man();
break;
case "woman":
p = new Woman();
break;
}
return p;
}
}
有人说初级工程师的工作就是ctrl+c和ctrl+v,这并不是一个好的习惯,这说明你的代码有好多重复的地方,那么以后维护的时候就是灾难。这就是为什么好的代码是不断优化,而好的设计就是总结出来的设计模式。
工厂方法:
interface IPeopleFactory{
People createPeople();
}
public class ManFactory implements IPeopleFactory{
public People createPeople(){
return new Man();
}
}
public class WomanFactory implements IPeopleFactory{
public People createPeople(){
return new Woman();
}
}
但是工厂方法依然有问题没有解决,就上面的例子,如果要给工厂接口添加一个创建外星生物方法。
抽象工厂方法
interface IFactory{
People createPeople();
WaiXingRen createWaiXingRen();
}
public class ManFactory implements IPeopleFactory{
public People createPeople(){
return new Man();
}
public IWaiXinRen createWaiXingRen(){
return new WaiWan();
}
}
public class WomanFactory implements IPeopleFactory{
public People createPeople(){
return new Woman();
}
public IWaiXingRen createWaiXingRen(){
return new WaiWoman();
}
}
//另外还有要添加IWaiXingRen 接口和男外星人和女外星人实现,就不写了
是不是要在添加更多的类,还要修改工厂接口和实现。如果需求变成这样不如还写成简单工厂的方式,如下:
简单工厂改进抽象工厂方法
public class Factory{
//参数可以提出去,做成全局配置,也可以通过配置文件载入
public static IPeople createPeople(String args){
IPeople p = null;
switch(args){
case "man":
p = new Man();
break;
case "woman":
p = new Woman();
break;
}
return p;
}
public static IWaiXingRen createWaiXingRen(String args){
IWaiXingRen w = null;
switch(args){
case "man":
w = new WaiMan();
break;
case "woman":
w = new WaiWoman();
break;
}
return w;
}
}
总结:
工厂方法与简单工厂的区别就是工厂职责单一,这就实现了对扩展开放的原则,如果添加需求不用区修改原有工厂的方法,但是如果需求需要变更工厂里的内容,则还是需要简单工厂来构造更方便。工厂方法是简单工厂的进一步抽象和推广。而简单工厂是抽象工厂方法的浓缩。
另外可以利用反射可以避免分支判断的问题。
perfact