设计模式之——工厂方法模式

一、基本介绍

工厂方法模式(创建型):定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

 

二、包含角色

1.抽象工厂:提供了创建产品的接口,每个具体工厂的父类接口。

2.具体工厂:抽象工厂的实现类,负责创建具体的产品。

3.抽象角色:需要定义产品的抽象,为工厂创建出来实例的公共接口。

4.具体产品:抽象角色的实现类,由工厂返回的具体产品实例。

 

三、案例及UML类图

案例说明:

             某个客户需要不同种类的交通工具,我们使用简单工厂根据客户需要去创建不同种类的交通工具,并且该客户以后                可能还会拓展新的种类。

UML类图:

类VehicleFactory:

public interface VehicleFactory {

    Vehicle getVehicle();
}

说明:交通工具工厂接口,抽象工厂角色,定义所有工厂的公共接口。

类BicycleFactory:

public class BicycleFactory implements VehicleFactory {

    @Override
    public Vehicle getVehicle() {
        return new Bicycle();
    }
}

说明:自行车工厂类,具体工厂角色,用于创建自行车产品。

类CarFactory:

public class CarFactory implements VehicleFactory {

    @Override
    public Vehicle getVehicle() {
        return new Car();
    }
}

说明:汽车工厂类,具体工厂角色,用于创建汽车产品。

类Vehicle:

public interface Vehicle {
 
 
    /**
     * 交通工具都能开,且每一类交通工具行驶的方式都不一样
     */
    void drive();
 
}

说明:交通工具接口定义类,抽象角色。

 

类Bicycle:

public class Bicycle implements Vehicle {
 
    @Override
    public void drive() {
        System.out.println("自行车两个轮子行驶!");
    }
}

说明:交通工具类Vehicle的实现类之一,具体产品,自行车产品。

 

类Car:

public class Car implements Vehicle {
 
    @Override
    public void drive() {
        System.out.println("汽车四个轮子行驶!");
    }
}

说明:交通工具类Vehicle的实现类之一,具体产品,汽车产品。

 

类FactoryMethodTest:

public class FactoryMethodTest {

    public static void main(String[] args) {
        //客户端通过创建不同的工厂来创建不同的产品
        VehicleFactory factory = new CarFactory();
        Vehicle vehicle1 = factory.getVehicle();
        factory = new BicycleFactory();
        Vehicle vehicle2 = factory.getVehicle();
        vehicle1.drive();;
        vehicle2.drive();
    }
}

说明:测试以及客户端类。

 

四、优缺点

优:符合开闭原则,当需要新增产品时,新增具体工厂类和具体产品类即可。

缺:每次都需要创建多个类,增加系统开销。当抽象类要修改时,则需要修改大量的具体子类,增大工作量。

 

五、适用场景

1.适用于不知道具体种类且种类短时间还会继续增加的对象的创建,可无限拓展(如奶茶店的奶茶种类,可能明天 * 又会推出新的奶茶)

 

六、其它

注意事项:工厂方法模式是一个工厂创建一种产品,每次有新种类的产品要添加时,必须创建新的工厂以及新的产品。

发布了35 篇原创文章 · 获赞 61 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/m0_37914588/article/details/103890274