我们来设想这样一个 场景,现实生活中,家庭都有一辆车,那么这辆车是由谁生产的。显然是汽车工厂。所以,我们就可以通过简单工厂去编写一套代码。
2.code接口Car
定义接口可以防止耦合度。
public interface Car {
public void run();
}
BenzCar
BenzCar实现Car
public class BenzCar implements Car {
@Override
public void run() {
System.out.println("benzCar run");
}
}
FortCar
FortCar实现Car
public class FortCar implements Car{
@Override
public void run() {
System.out.println("福特run");
}
}
定义一个汽车工厂
我们通过Properties加载配置文件。动态创建汽车。
Properties文件
car=com.ncst.simplefactory.BenzCar
public class CarFactory {
private static Properties properties = new Properties();
static {
try {
properties.load(CarFactory.class.getResourceAsStream("config.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
//汽车工厂对外暴露一个创建汽车的方法。
public static Car newCar() throws Exception {
String carName = (String) properties.get("car");
Class clazz = Class.forName(carName);
return (Car) clazz.newInstance();
}
}
Family类
public class Family {
private Car car;//面向接口
public Family(Car car){
this.car = car;
}
public void goOut() throws Exception {
System.out.println("gogo");
car.run();
}
}
Test
public static void main(String[] args) throws Exception {
Car car = CarFactory.newCar();
Family family = new Family(car);
family.goOut();
}
3.总结
通过汽车工厂,我们就可以解决family依赖具体的汽车。而反射会让程序更加灵活。
最后,有一个小知识点,通常,我们创建对象都是通过new,但是当一个abstract类不想被外界通过new创建对象,可以在自身声明一个私有的继承来,对外暴露一个newInstance()方法。
public abstract class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void learn();
//对外暴露创建instance();
public static Person newInstance(){
return new ColleageStudent();
}
public static class ColleageStudent extends Person{
@Override
public void learn() {
System.out.println("我是大学生。。。");
}
}
}
类图如下