工厂模式

1.前言

设计模式大二的时候就学了,但是现在有些也忘得差不多了,现在决定重新学一遍。

立个flag,一周至少学三种设计模式。

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

2.简单工厂模式

应用实例: 你需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。


/** 简单(静态)工厂模式
 * @author aRu
 * @date 2021/5/8 15:31
 */
public class CarFactory {
    public static Car getCar(String name){
        if(name.equals("大众")){
            return new DaZhong();
        }else if (name.equals("五菱")){
            return new WuLing();
        }
        return null;
    }
}
/**抽象汽车类
 * @author aRu
 * @date 2021/5/8 15:28
 */
public interface Car {
    void Name();
}
/** 大众
 * @author aRu
 * @date 2021/5/8 15:29
 */
public class DaZhong implements Car{
    @Override
    public void Name() {
        System.out.println("大众");
    }
}

----------------------------------------------------------------------------------------
    
/**五菱
 * @author aRu
 * @date 2021/5/8 15:30
 */
public class WuLing implements Car{
    @Override
    public void Name() {
        System.out.println("五菱");
    }
}

测试

/** 测试类
 * @author aRu
 * @date 2021/5/8 15:34
 */

//测试 简单(静态)工厂模式
public class Test {
    public static void main(String[] args) {
        Car car1 = CarFactory.getCar("大众");
        Car car2 = CarFactory.getCar("五菱");

        car1.Name();
        car2.Name();
    }
}

缺点:试想当老板提出新需求要加一辆本田汽车的时候,你会发现,你此时不得不去修改CarFactory这个类,这就违反了开闭原则.

3.方法工厂模式

针对上面简单工厂的缺点,我们引出方法工厂模式。

在方法工厂模式中,我们将工厂抽象起来,使得每个品牌的汽车都有自己的工厂,而不是像简单工厂模式里,一个大工厂建造不同品牌的车。

当我们需要新添加汽车时,只需要添加新的汽车类和对应的工厂就好。


image-20210508161255712
//抽象汽车工厂
public interface CarFactory {
    Car getCar();
}
//具体的汽车工厂  
public class WuLingFactory implements CarFactory{
    //五菱工厂
    @Override
    public Car getCar() {
        return new WuLing();
    }
}

----------------------------------------------
 public class DaZhongFactory implements CarFactory{
     //大众工厂
    @Override
    public Car getCar() {
        return new DaZhong();
    }
}
//抽象汽车类
public interface Car {
    void Name();
}
//具体汽车类
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 Test {    public static void main(String[] args) {        Car car = new WuLingFactory().getCar();        Car car2 = new DaZhongFactory().getCar();        car.Name();        car2.Name();    }}

4.抽象工厂模式