工厂模式分为三种
第一种:普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
我们来看个小例子(关于笔和写的案例)
首先我们写一个接口类,里面定义一个写的方法:
public interface Writer {
public void write();
}
然后我们来看实现类:
public class GangBi implements Writer {
@Override
public void write() {
// to do something
}
}
public class MaoBi implements Writer {
@Override
public void write() {
// to do something
}
}
然后创建工厂类:public class WriteFactory {
// 简单工厂模式,弊端:如果字符串输错,实例就创建不成功
public Writer produce(String type) {
if ("gb".equals(type)) {
return new GangBi();
} else if ("mb".equals(type)) {
return new MaoBi();
} else {
return null;
}
}
}
测试类:public class FactoryTest {
public static void main(String[] args) {
WriteFactory factory = new WriteFactory();
Writer write = factory.produce("mb");
write.write();
}
}
上面是简单工厂模式,上面注释也说了,如果输入的字符串有错,则不能正确常见对象,并且这种方法也并不友好,所以这种工厂模式不推荐使用。第二种,多工厂模式:就是对工厂方法进行改进,提供多个工厂方法,分别创建对象。
修改WriteFactory如下:
public class WriteFactory {
public Writer produceGb() {
return new GangBi();
}
public Writer produceMb() {
return new MaoBi();
}
}
测试类:public class FactoryTest {
public static void main(String[] args) {
WriteFactory factory = new WriteFactory();
Writer write = factory.produceMb();
write.write();
}
}
这种方法避免了上面讲的问题。第三种,静态工厂模式:修改工厂类里面的方法,把所有方法都变成静态的,这样,调用工厂方法的时候不需要创建实例就可以了。
public class WriteFactory {
public static Writer produceGb() {
return new GangBi();
}
public static Writer produceMb() {
return new MaoBi();
}
}
测试类:public class FactoryTest {
public static void main(String[] args) {
Writer write = WriteFactory.produceMb();
write.write();
}
}
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且有共同的接口时,可以通过工厂模式方法进行创建。上述三那种模式中,第一种如果字符串输错了,会导致实例创建不成功,第三种相对于第二种不要创建工厂方法实例,所以,大多数情况下,推荐使用第三种静态工厂模式。
public class WriteFactory {
public static Writer produceGb() {
return new GangBi();
}
public static Writer produceMb() {
return new MaoBi();
}
}