实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象
1、定义一个接口:
public interface Runner {
//行驶
void run();
}
2、 定义具体的业务实现类:
/**
汽车实现类
*/
public class CarRunner implements Runner {
@Override
public void run() {
System.out.println("汽车在行驶。。。");
}
}
/**
飞机是实现类
*/
public class PlaneRunner implements Runner {
@Override
public void run() {
System.out.println("飞机在飞行。。。");
}
}
3、定义简单工厂类:
public class EasyFactory {
private static Runner runner = null;
private static Runner car() {
System.out.println("请乘客系好安全带");
return new CarRunner();
}
private static Runner plane() {
System.out.println("请乘客系好安全带");
return new PlaneRunner();
}
// 简单工厂,根据字符串创建相应的对象
public static Runner createRuner(String name) {
switch (name) {
case "Car":
runner = car();
break;
case "Plane":
runner = plane();
break;
}
return runner;
}
}
4、特点说明
-
优点:
我们无需提供具体的子类类名,只需要提供一个字符串即可得到相应的实例对象。这样的话,当子类的类名更换或者增加子类时我们都无需修改客户端代码,只需要在简单工厂类上增加一个分支判断代码即可。
使用这种模式,我们在生成工厂的时候可以加一些业务代码,如日志、判断业务等,这时候可以直接在switch case中加上去就行了: -
缺点:
和业务关联太大,这会导致这个简单工厂类很庞大臃肿、耦合性高,而且增加、删除某个子类对象的创建都需要打开简单工厂类来进行修改代码也违反了开-闭原则。
评论区