从简单案例了解设计模式–工厂模式
在工厂模式的学习中我们使用面条的一个简单案例,通过传统new对象的方式和工厂模式进行比对,加深对工厂模式的了解。
传统模式开发
定义吃面条的接口
public interface INoodles {
/**
* 描述每种面条啥样的
*/
public abstract void desc();
}
各种实现类
public class LzNoodles implements INoodles {
@Override
public void desc() {
System.out.println("兰州拉面,兰州特色小吃");
}
}
public class PaoNoodles implements INoodles {
@Override
public void desc() {
System.out.println("泡面,程序员必备");
}
}
public class ReganNoodles implements INoodles {
@Override
public void desc() {
System.out.println("红油热干面,武汉特色小吃");
}
}
使用
// 做拉面吃
INoodles lzNoodles = new LzNoodles();
// 做泡面吃
INoodles paoNoodles = new PaoNoodles();
// 做热干面吃
INoodles reganNoodles = new ReganNoodles();
// 然而,new来new去,改来改去,好心烦......
分析: 每次都要去new对象,来生成各种面条类的实例对象,这里的理解就相当于自己做面条想吃什么面条这里就new哪种面条。
工厂模式开发
就吃面条的案例而言,如果说new对象的方式相当于自己做面条的话,那么工厂模式就相当于去面馆吃面条,只要告诉面馆你要那种面条就能得到想要的面条。
创建简单的面馆工厂SimpleNoodlesFactory
如果生产对象的方法是static的,这种简单工厂也叫做静态工厂
如果生产对象的方法不是static的,这种简单工厂也叫做实例工厂
/**
* 简单工厂模式
* 一家“简单面馆”(简单工厂类)
*/
public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1;//兰州拉面
public static final int TYPE_PM = 2;//泡面
public static final int TYPE_GK = 3;//热干面
/**
*
* @param type
* @return
*/
public static INoodles createNoodles(int type) {
switch (type) {
case 1:
return new LzNoodles();
case 2:
return new PaoNoodles();
case 3:
return new ReganNoodles();
default:
return new LzNoodles();
}
}
}
测试
INoodles iNoodles = SimpleNoodlesFactory.createNoodles(2); // 和具体的对象脱离关系
iNoodles.desc();
由以上得出结论
使用工厂模式的场景
- 当用户程序不需要知道要使用对象的创建过程
- 客户程序使用的对象存在变动的可能,或者根本就不知道使用具体哪一个对象
工厂方法模式
当面馆扩张之后,每个种类的面条都由一个专属的面馆来制作,这里我们就设计到了工厂的接口和方法。
定义工厂接口
/**
* 工厂方法模式
*/
public interface INoodlesFactory {
INoodles createNoodles();
}
常见接口实现类
public class LzINoodlesFactory implements INoodlesFactory {
@Override
public INoodles createNoodles() {
return new LzNoodles();
}
}
public class PaoINoodlesFactory implements INoodlesFactory {
@Override
public INoodles createNoodles() {
return new PaoNoodles();
}
}
public class ReganINoodlesFactory implements INoodlesFactory {
@Override
public INoodles createNoodles() {
return new ReganNoodles();
}
}
测试
public static void main(String[] args) {
INoodlesFactory noodlesFactory = new LzINoodlesFactory();
INoodles noodles = noodlesFactory.createNoodles();
noodles.desc();
}