工厂模式(new对象不需要关注对象需要的参数,直接从工厂获取对象)

消费者不使用new 对象创建实例,而直接获取    工厂创建的对象

有三种:简单工厂,方法工厂,超级工厂

 

简单工厂(使用多,简单易读,但需要新的类对象时,需要修改工厂原有的代码)

一个工厂使用static静态方法创建不同对象,消费者通过一个工厂获取需要的对象

public class 汽车工厂 {
    public static 汽车 getCar(String car){
        if(car.equals("五菱宏光")){
            return new 五菱宏光();
        }else if(car.equals("特斯拉")){
            return new 特斯拉();
        }else {
            return null;
        }
    }
}
public class 消费者 {
    public static void main(String[] args) {
        //new对象不需要关注对象需要的参数
        汽车 汽车1 = 汽车工厂.getCar("五菱宏光");
        汽车 汽车2 = 汽车工厂.getCar("特斯拉");

        汽车1.name();
        汽车2.name();
    }
}

 

方法工厂(更符合设计原则,不会改变工厂原有的代码,每多一个需要的类对象,就多一个工厂)

通过不同的工厂创建不同的对象,消费者通过不同的工厂获取不同的对象

public class 五菱宏光工厂 implements 汽车工厂 {
    @Override
    public 汽车 getCar() {
        return new 五菱宏光();
    }
}
public class 特斯拉工厂 implements 汽车工厂 {
    @Override
    public 汽车 getCar() {
        return new 特斯拉();
    }
}
public class 消费者 {
    public static void main(String[] args) {
        汽车 car1 = new 五菱宏光工厂().getCar();
        汽车 car2 = new 特斯拉工厂().getCar();
        car1.name();
        car2.name();
    }
}

 

抽象工厂(可以增加产品族(品牌),添加新的产品代码修改复杂,不易理解,适用于稳定代码)

工厂继承抽象工厂,不同生产商工厂   各自实现   生产自身品牌不同类型产品(手机,路由器,笔记本)的方法,    修改抽象工厂添加新的产品,所有的子工厂都要修改自身的实现

小米工厂  继承工厂    生产小米手机,小米路由器,小米笔记本

华为工厂  继承工厂    生产华为手机,华为路由器,华为笔记本

 

public class 小米工厂 implements 抽象工厂{

    @Override
    public 抽象手机 getPhone() {
        return new 小米手机();
    }

    @Override
    public 抽象路由器 getRouter() {
        return new 小米路由器();
    }
}
public class 消费者 {
    public static void main(String[] args) {
        抽象手机 华为手机 = new 华为工厂().getPhone();
        华为手机.打电话();
        华为手机.玩游戏();
        华为手机.联网();
        抽象手机 小米手机 = new 小米工厂().getPhone();
        小米手机.打电话();
        小米手机.玩游戏();
        小米手机.联网();
        抽象路由器 小米路由器 = new 小米工厂().getRouter();
        小米路由器.联网();

    }
}