所有分类
  • 所有分类
  • 未分类

工厂模式Java实战–写法2:工厂方法模式

简介

本文介绍工厂模式的工厂方法模式。

优缺点

优点

解决了简单工厂的缺点,新增工厂类时很方便,符合开闭原则。

缺点

无。

实战

需求:根据参数(小米、华为)获取一个Phone(手机)对象,并调用它打电话方法。

代码结构

手机产品

接口

package com.knife.designPattern.product;
 
public interface Phone {
    /**
     * 打电话
     */
    String callUp();
}

实现类

小米手机实现类

package com.knife.designPattern.product.impl;

import com.knife.designPattern.product.Phone;
import lombok.Data;

@Data
public class XiaoMiPhoneImpl implements Phone {
    /**
     * CPU个数
     */
    private Integer cpuCount;

    /**
     * 内存大小
     */
    private Integer memoryStorage;

    public XiaoMiImpl(Integer cpuCount, Integer memoryStorage) {
        this.cpuCount = cpuCount;
        this.memoryStorage = memoryStorage;
    }
 
    @Override
    public String callUp() {
        return "小米手机打电话";
    }
}

华为手机实现类

package com.knife.designPattern.product.impl;

import com.knife.designPattern.product.Phone;
import lombok.Data;

@Data
public class HuaWeiPhoneImpl implements Phone {
    /**
     * CPU个数
     */
    private Integer cpuCount;

    /**
     * 内存大小
     */
    private Integer memoryStorage;

    public HuaWeiImpl(Integer cpuCount, Integer memoryStorage) {
        this.cpuCount = cpuCount;
        this.memoryStorage = memoryStorage;
    }

    @Override
    public String callUp() {
        return "华为手机打电话";
    }
}

工厂类

接口

package com.knife.designPattern.factory;

import com.knife.designPattern.product.Phone;

public interface PhoneFactory {
    Phone createPhone();
}

实现

小米实现类

package com.knife.designPattern.factory.impl;

import com.knife.designPattern.factory.PhoneFactory;
import com.knife.designPattern.product.Phone;
import com.knife.designPattern.product.impl.XiaoMiPhoneImpl;

public class XiaoMiFactoryImpl implements PhoneFactory {
    public Phone createPhone() {
        return new XiaoMiPhoneImpl(4, 21);
    }
}

华为实现类

package com.knife.designPattern.factory.impl;

import com.knife.designPattern.factory.PhoneFactory;
import com.knife.designPattern.product.Phone;
import com.knife.designPattern.product.impl.HuaWeiPhoneImpl;

public class HuaWeiFactoryImpl implements PhoneFactory {
    public Phone createPhone() {
        return new HuaWeiPhoneImpl(4, 21);
    }
}

测试类

package com.knife.designPattern.controller;

import com.knife.designPattern.factory.impl.HuaWeiFactoryImpl;
import com.knife.designPattern.factory.impl.XiaoMiFactoryImpl;
import com.knife.designPattern.product.Phone;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "产品")
@RestController
@RequestMapping("product")
public class ProductController {
    @ApiOperation("手机")
    @GetMapping("phone")
    public String phone(String name) {
        Phone phone = null;
        switch (name) {
            case "华为":
                phone = new HuaWeiFactoryImpl().createPhone();
                break;
            case "小米":
                phone = new XiaoMiFactoryImpl().createPhone();
                break;
            default:
                return null;
        }

        if (phone != null) {
            return phone.callUp();
        }

        return null;
    }
}

这里是判断了产品名字,然后去调用相关的工厂,这里也可以像简单工厂一样,把这个步骤封装起来。

源码下载

此隐藏内容仅限VIP查看升级VIP

测试

访问:http://localhost:8080/doc.html(当然,你用Postman也完全可以)

结果:

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录