设计模式-工厂模式(Java)

工厂方法模式

工厂方法模式:Factory Method

事物是发展的,随着事物的不断发展,原有的对象会随着发展不断变化,或增或减。
工厂方法模式提供的一种封装机制,隔离出了那些易变动的对象。这个时候需求的变动不再影响之前的对象的变动了。

一、工厂方法模式角色

  • 1、抽象产品:所有子类产品的基类,给出一个抽象接口或抽象类。
  • 2、具体产品:继承抽象产品的属性、方法,具有某种特质的具体产品。
  • 3、抽象工厂:包含产品的核心业务逻辑,给出一个抽象接口或抽象类。
  • 4、具体工厂:继承抽象工厂的具体工厂,实现具体业务逻辑。

二、工厂方法使用场景

1、无法预知对象确切类别及其依赖关系时。
2、为了能够扩展代码中的组件时。
3、复用现有对象节省系统资源时。

三、工厂方法案例及代码实现

华为是一家集团,包含有手机、网络、手表、路由、汽车等等产业。在一开始的华为并没有汽车业务,它的起家是从网络交换机开始的。那么当我们在代码中定义华为时,是无法预知它未来的业务及其依赖关系的,此时就适用于工厂方法模式。

对应的工厂方法模式角色如下:
1、抽象产品:华为产品
2、具体产品:华为手表、华为汽车、华为路由
3、抽象工厂:华为工厂
4、具体工厂:华为手机工厂、华为汽车工厂、华为路由工厂

3.1 工厂方法代码实现

1、示例图/UML图

工厂方法示例图

在这里插入图片描述

2、抽象产品

定义一个产品接口,为所有产品的父类:HuaWeiProduct.java,其定义了常量:MANUFACTURER(制造商)=HuaWei;抽象接口:getManufacturer()获取制造商;getProductName()获取具体产品名称

public interface  HuaWeiProduct {
    
    
    /**
     * 华为产品制造商必定都是华为
     **/
     String MANUFACTURER = "HuaWei";

    /**
     * 通过产品可以获取制造商
     **/
    String getManufacturer();

    /**
     * 通过产品可以获取产品名称
     **/
    String getProductName();
}

3、具体产品

1、手机产品

华为产品的子类,实现抽象产品的抽象接口:HuaWeiPhone.java

public class HuaWeiPhone implements HuaWeiProduct {
    
    
    @Override
    public String getManufacturer() {
    
    
        return HuaWeiProduct.MANUFACTURER;
    }

    @Override
    public String getProductName() {
    
    
        return "华为手机";
    }
}

手机在未来阶段会有多种类型,这里建立Mate产品和Nova产品,继承手机产品类,重写getProductName()方法。

public class HuaWeiMatePhone extends HuaWeiPhone{
    
    
    @Override
    public String getProductName() {
    
    
        return super.getProductName() + ":Mate系列手机";
    }
}

public class HuaWeiNovaPhone extends HuaWeiPhone{
    
    
    @Override
    public String getProductName() {
    
    
        return super.getProductName() + ":Nova系列手机";
    }
}

2、汽车产品

华为产品的子类,实现抽象产品的抽象接口:HuaWeiCar.java

public class HuaWeiCar implements HuaWeiProduct {
    
    
    @Override
    public String getManufacturer() {
    
    
        return HuaWeiProduct.MANUFACTURER;
    }

    @Override
    public String getProductName() {
    
    
        return "华为汽车";
    }
}

汽车在未来阶段会有多种类型,目前只有“问界”,继承汽车产品类,重写getProductName()方法。

public class HuaWeiWenJieCar extends HuaWeiCar{
    
    

    @Override
    public String getProductName() {
    
    
        return super.getProductName() + ":问界汽车";
    }
}

4、抽象工厂

定义一个工厂接口,工厂存在的意义:生产。HuaWeiFactory.java,抽象接口:produce()生产产品

public interface HuaWeiFactory<T> {
    
    
    /**
     * 生产方法
     **/
    T produce(Class<? extends T> classz);
}

5、具体工厂

1、手机工厂

实现抽象工厂的方法,是实际创建产品的地方,含有具体创建产品的业务逻辑。这里实现了抽象工厂的produce()方法,通过反射创建对象。

public class HuaWeiPhoneFactory implements HuaWeiFactory<HuaWeiPhone> {
    
    
    /**
     * 华为手机工厂生产手机
     **/
    @Override
    public HuaWeiPhone produce(Class<? extends HuaWeiPhone> classz) {
    
    
        try {
    
    
            return classz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
    
    
            e.printStackTrace();
            return null;
        }
    }
}

2、汽车工厂

实现抽象工厂的方法,是实际创建产品的地方,含有具体创建产品的业务逻辑。这里实现了抽象工厂的produce()方法,通过反射创建对象。

public class HuaWeiCarFactory implements HuaWeiFactory<HuaWeiCar> {
    
    
    /**
     * 华为汽车工厂生产汽车
     **/
    @Override
    public HuaWeiCar produce(Class<? extends HuaWeiCar> classz) {
    
    
        try {
    
    
            return classz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
    
    
            e.printStackTrace();
            return null;
        }
    }
}

6、通过工厂创建对象

1、实例化手机、汽车工厂:HuaWeiPhoneFactoryHuaWeiCarFactory
2、通过工厂的produce()方法,传入具体需要创建的产品。
3、输出具体产品的制造商与产品名称。

public static void main(String[] args) {
    
    
    //华为手机工厂
    HuaWeiFactory<HuaWeiPhone> huaWeiPhoneFactory = new HuaWeiPhoneFactory();
    //华为汽车工厂
    HuaWeiFactory<HuaWeiCar> huaWeiCarFactory = new HuaWeiCarFactory();
    
    HuaWeiProduct huaWeiMateProduct = huaWeiPhoneFactory.produce(HuaWeiMatePhone.class);
    HuaWeiProduct huaWeiNovaProduct = huaWeiPhoneFactory.produce(HuaWeiNovaPhone.class);
    HuaWeiProduct huaWeiWenJieProduct = huaWeiCarFactory.produce(HuaWeiWenJieCar.class);

    System.out.println(huaWeiMateProduct.getManufacturer()+huaWeiMateProduct.getProductName());
    System.out.println(huaWeiNovaProduct.getManufacturer()+huaWeiNovaProduct.getProductName());
    System.out.println(huaWeiWenJieProduct.getManufacturer()+huaWeiWenJieProduct.getProductName());
}

结果如下:

HuaWei华为手机:Mate系列手机
HuaWei华为手机:Nova系列手机
HuaWei华为汽车:问界汽车

猜你喜欢

转载自blog.csdn.net/qq_36986510/article/details/128614323