设计模式--工厂模式笔记

常用的工厂模式分为两种类型

  • 简单工厂模式
    简单工厂模式是有一个工厂对象决定创建哪一种产品类的实例
    它的本质是通过传入不同的参数来实现多态,然后达到实例化不同对象的目的

/**
 * 別馬
 * create in 2021/12/2 0002
 * 10:27
 */
//汽车工厂接到客户什么车型的订单就生产什么车型并交还给客户
public class Carfactory {
   public static Car getcar(String car){
       if(car.equals("wuling"))
       {
           return new wuling();
       }
       else  if(car.equals("tesla"))
       {
           return  new Tesla();
       }
       else return  null;

   }
}


//顾客考虑买啥车直接去工厂提车 不需要直接new对象 创造车出来
public class Customer {
    public static void main(String[] args) {
        Car car1 = Carfactory.getcar("tesla");
        Car car2 = Carfactory.getcar("wuling");
        car1.name();
        car2.name();
    }
}

public interface Car {
    void name();
}


客户要啥车 车厂给造啥车,客户不需要了解如何造车或者需要的参数列表,省去了代码量
设计模式--工厂模式笔记
简单工厂模式的缺点:
1.使用简单工厂模式将会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。
2.系统扩展困难,一旦添加新产品,就不得不修改工厂逻辑,在产品类型较多时有可能造成工厂逻辑过于复杂不利于系统的扩展和维护
3.简单工厂模式严重违背了对扩展开放,对修改关闭的原则(开闭原则)

  • 工厂方法模式

上面的简单工厂模式存在着一个问题,就是当客户想要一辆新的厂里并不存在的车型时,车厂需要更改产线设计(更改代码),成本更高了(违背了设计模式中的开闭原则),所以有了这个工厂方法模式

工厂方法模式:
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交由子类去做,这个核心类或接口则成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触实例化产品类。
适用场景:
一个类不知道它所需要的对象的类,在工厂方法模式中,客户端不需要指定具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端只需要知道创建具体产品的工厂即可。

工厂方法模式的优点:
1.基于工厂角色和产品角色多态性的设计是工厂方法模式的关键,它能够使工厂自主确定创建哪种产品对象,而如何创建这个对象的细节则完全封装到具体工厂内部。工厂方法模式,又称为多态性工厂模式,正是因为所有的具体工厂类都具有同一抽象父类或者实现同一个工厂接口。
⒉.使用工厂方法模式在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其它的具体工厂和具体产品,只需要添加一个具体工厂和具体产品就好。这样,系统的可扩展性也就变得更好,完全符合“开闭原则”。

工厂方法模式的缺点:
1.在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数成对增加,在一定程度上增加了系统的复杂度。
2.由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时还可能需要用到反射机制等技术,增加了系统的实现难度。

//顾客给工厂下订单(new xxxFactory) 工厂造车给客户
public class Customer {
    public static void main(String[] args) {

        Car car1 = new wulingFactory().getcar();
        Car car2 = new TeslaFactory().getcar();

        car1.name();
        car2.name();
    }
}


//特斯拉工厂提供车
public class TeslaFactory {

    Car getcar() {

        return new Tesla();
    }
}
//五菱工厂提供车
public class wulingFactory {

    Car getcar(){

        return  new wuling();
    }

}


设计模式--工厂模式笔记
执行效果是一致的,但是扩展性不会破坏到设计模式的开闭原则,有需要增加新的车型直接再添加一个车型类和一个制造车型的工厂类就行,但是这么做代码量太大了,每次需要新增类别都得创建两个类,当数量一多,就会非常臃肿。

在实际开发学习生活中,我们更多的还是会考虑使用简单工厂模式,设计模式的原则只是起到一个引导作用,实际开发还是得按照需求为起点出发

上一篇:2022.01.14局部内部类


下一篇:数据库mysql自建模拟购物系统(建表语句、检索语句)