工厂模式

作用:实现了创建者和调用者分离

分类:

  • 简单工厂模式:用来生产同一等级结构中的任意产品(对于新增的产品,需要扩展已有代码)
public interface Car {
    void name();
}

//静态工厂模式
//对于增加一个新的产品,如果不修改代码就做不到
//大多数情况下就是使用这种简单工厂模式,为了满足开闭原则会付出很大的代价==》工厂方法模式
public class CarFactory {
    //方法一
    public static Car getCar(String car){
        if(car.equals("五菱"))
        {
            return new Wuling();
        }else if(car.equals("特斯拉"))
        {
            return new Tesla();
        }else
        {
            return null;
        }
    }
    //方法二
    public static Car getDazhong(){
        return new Dazhong();
    }
}
public class Tesla implements Car{
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}
public class Wuling implements Car{
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}
public class Consumer {
    public static void main(String[] args) {
       /* 原始方式创建
        需要知道接口,所有的实现类
        Car car=new Wuling();
        Car car1=new Tesla();
        car.name();
        car1.name();*/
        //使用工厂创建
        Car car=CarFactory.getCar("五菱");
        Car car1=CarFactory.getCar("特斯拉");
        car.name();
        car1.name();
    }
}

  • 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
public interface Car {
    void name();
}

//工厂方法模式
//随时动态扩展,满足开闭原则,但是每多一个产品就会多一个扩展类
public interface CarFactory {
    Car getCar();
}
//结构复杂度
/* simple
* 代码复杂度
* simple
* 编程复杂度
* simple
* 管理复杂度
* simple*/

//根据设计原则:应该使用工厂方法模式
//根据实际业务:应该使用简单工厂模式
public class Mobai implements Car{
    @Override
    public void name() {
        System.out.println("摩拜单车");
    }
}
public class MobaiFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Mobai();
    }
}

public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}
public class TeslaFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

public class Wuling implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}
public class Wuling implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}

public class Consumer {
    public static void main(String[] args) {
        Car car1=new WulingFactory().getCar();
        Car car2=new TeslaFactory().getCar();
        Car car3=new MobaiFactory().getCar();
        car1.name();
        car2.name();
        car3.name();
    }
}

  • 抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂(关注产品等级+产品族),当产品更加稳定时会更有效率
    不增加具体的产品,但是可以增加产品族(生产厂商)

核心本质:

  • 实例化对象不适用new,用工厂方法代替
  • 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

总结:

  • 简单工厂模式:虽然不符合设计原则,但实际使用最多
  • 工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展(符合设计原则)
  • 抽象工厂模式:不可以增加产品但是可以增加产品族

应用:

  1. JDK中的Calendar的getInstance方法
  2. JDBC中的Connection对象的获取
  3. Spring中IOC容器创建管理bean对象
  4. 反射中Class对象的newInsetance方法
posted @ 2022-02-26 09:47  一刹流云散  阅读(39)  评论(0编辑  收藏  举报