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

工厂模式Java实战-写法1:简单工厂模式

简介

本文介绍工厂模式的简单工厂模式。

优缺点

优点

解决了不用工厂模式时的缺点,使用与构建进行了隔离。

缺点

若增加一类手机,比如:苹果,除了要增加Phone的实现类之外,还要修改工厂类。违反开闭原则。

实战

需求:根据参数(小米、华为)获取一个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;
import com.knife.designPattern.product.impl.HuaWeiPhoneImpl;
import com.knife.designPattern.product.impl.XiaoMiPhoneImpl;

public class PhoneFactory {
    public static Phone createPhone(String name) {
        Phone phone = null;
        switch (name) {
            case "华为":
                phone = new HuaWeiPhoneImpl(4, 21);
                break;
            case "小米":
                phone = new XiaoMiPhoneImpl(4, 21);
                break;
            default:
                return null;
        }

        return phone;
    }
}

可以看到,简单工厂模式就是把创建对象的逻辑单独写为了一个方法,抽离了出来。

测试类

package com.knife.designPattern.controller;

import com.knife.designPattern.factory.PhoneFactory;
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 = PhoneFactory.createPhone(name);
        if (phone != null) {
            return phone.callUp();
        }

        return null;
    }
}

源码下载

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

测试

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

可以看到:调用了小米的打电话方法。

0

评论0

请先

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

社交账号快速登录