一直对工厂模式没有仔细研究总结,今天就结合实际工作中根据工厂模式的作用对工厂模式进行解析。可能理解有偏差,望指正
我对工厂模式最直观的使用就是对相似功能的类通过接口提供的抽象公共方法进行构造。下面使用java程序员作为例子:
package demo.design_pattern.factory;
public interface Programmer {
void code();//程序员都要编码
}
java初级程序员需要实现:
package demo.design_pattern.factory;
public class PrimaryProgrammer implements Programmer {
@Override
public void code() {
System.out.println("primary programmer");
}
}
java高级程序员:
package demo.design_pattern.factory;
public class SeniorProgrammer implements Programmer {
@Override
public void code() {
System.out.println("senior programmer");
}
}
这样的在需要实例的java初级和java高级程序员对象的时候你就需要new,可以封装成简单工厂模式:
package demo.design_pattern.factory;
public class ProgrammerFactory {
public static final String PRIMARY="primary";
public static final String SENIOR="senior";
public static Programmer getInstance(String sign)
{
switch (sign) {
case PRIMARY:
return new PrimaryProgrammer();
case SENIOR:
return new SeniorProgrammer();
default:
return null;
}
}
}
但是很明显可以看到这个工厂类构造的实例是有限的,在实际工作中很肯能需要增加新的实现类就会频发的修改代码,所以就有了对简单工厂模式进行抽象的做法,工厂方法模式:
package demo.design_pattern.factory;
public interface IFactory {
Programmer getInstance();
}
package demo.design_pattern.factory;
public class PrimaryFactory implements IFactory {
@Override
public Programmer getInstance() {
return new PrimaryProgrammer();
}
}
package demo.design_pattern.factory;
public class SeniorFactory implements IFactory {
@Override
public Programmer getInstance() {
return new SeniorProgrammer();
}
}
这种模式你可以任意增加新的实现接口的对象(比如新增一个java中级程序员),当然到这里可以发现一个程序员的实例构造我们进行了两层抽象,这样可能在具体的业务中你会发现很多功能都进行两层抽象会很麻烦,比如现在需要新增一个c++初级程序员,那你就必须新增两层的抽象方法,当然你很自然的想到我可以把java和c程序员放在一个工厂中生产啊,这就衍生出抽象工厂方法,就是将所有具有相似业务功能尽可能放在一个工厂中实现业务逻辑。
在此我想说简单工厂模式其实相对来说是一种无所不包含的模式,啥都可以生产,只要你提取出中生产的对象的抽象化。工厂模式就好比将简单工厂模式的产品进行分类,将统一的类型的产品由一个工厂进行生产,这是对简单工厂模式最好的进化,这样减去了简单工厂模式的负担,也是符合工厂模式的开发封闭原则。抽象工厂模式其实是工厂方法的一种推广,可以理解为分类的维度不同,程序员你可以分为java,c++,c#.程序员..,你也可以分为初级程序员、中级程序员、高级程序员。在工厂模式下java程序员工厂生产java程序员,c++程序员工厂生产c程序员,根据多重分类的情况下可能会造成不符合实际情况,那么就会用到抽象工厂模式,就是java工厂生产java初级程序员、java中级程序员、java高级程序员,c++程序员工厂生产c++初级程序员、c++中级程序员、c++高级程序员。
当然抽象工厂模式下的程序员工厂有三个方法,生产初级中级高级,那么你不能生产某种语言外其他衍生的东西。这就是所说抽象工厂不能新增新的产品类型,当然简单工厂模式和工厂方法模式的确可以新增新的产品类型。
工厂方法创建一种产品,抽象工厂创建的是一组产品,是一个产品系列。这里要注意的是“系列”的意思,也就是说,抽象工厂创建出的一组产品是成套的。
当你发现,有一个接口可以有多种实现的时候,可以考虑使用工厂方法来创建实例。
当你返现,有一组接口可以有多种实现方案的时候,可以考虑使用抽象工厂创建实例组。