1.简单工厂

我们来设想这样一个 场景,现实生活中,家庭都有一辆车,那么这辆车是由谁生产的。显然是汽车工厂。所以,我们就可以通过简单工厂去编写一套代码。

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("我是大学生。。。");
        }
    }
}

类图如下
【设计模式】简单工厂_设计工场_02