【常见的设计模式】工厂模式

【设计模式专题之工厂方法模式】2.积木工厂

题目描述
小明家有两个工厂,一个用于生产圆形积木,一个用于生产方形积木,请你帮他设计一个积木工厂系统,记录积木生产的信息。

输入描述
输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示生产的次数。
接下来的 N 行,每行输入一个字符串和一个整数,字符串表示积木的类型。积木类型分为 “Circle” 和 “Square”
两种。整数表示该积木生产的数量

输出描述
对于每个积木,输出一行字符串表示该积木的信息。

输入示例
3 Circle 1 Square 2 Circle 1

输出示例
Circle Block Square Block Square Block Circle Block

提示信息
在示例中,积木工厂生产了4块积木,其中有2块是圆形积木,2块是方形积木。根据输入的类型,每块积木的信息被输出到控制台。

思路

  1. 先声明接口 Block,不同积木类型,实现该接口
  2. 圆形&方形 积木,实现上述Block接口提供的方法 produce
  3. 实现一个积木生产工厂 BlockFactory,用于生成不同形状的积木对象
  4. main函数中,按要求,批量生产对应积木

注意

  • 字符串常量,统一整理归类放在开头处
  • BlockFactory考虑默认情况 default

Golang版本代码:

package main

import (
    "fmt"
)

const (
    StrTypeCircle = "Circle"        // 类型:圆形
    StrTypeSquare = "Square"        // 类型:方形
    StrCircleBlock = "Circle Block" // 输出:圆形积木
    StrSquareBlock = "Square Block" // 输出:方形积木
)

// Block 声明接口,不同积木类型,实现该接口
type Block interface {
    produce() string
}

// CircleBlock
type CircleBlock struct {}

// produce
func (b CircleBlock) produce() string { // 注意返回stirng类型
    return StrCircleBlock
}

// SquareBlock
type SquareBlock struct{}

// produce 实现square接口
func (b SquareBlock) produce() string {
    return StrSquareBlock
}

// BlockFactory 积木生产工厂
func BlockFactory(blockType string) (Block, error) {
    switch blockType {
        case StrTypeCircle:
            return CircleBlock{}, nil
        case StrTypeSquare:
            return SquareBlock{}, nil
        default:
            return nil, fmt.Errorf("input blockType error")
    }
}

func main() {
    // 输入生产次数
    n := 0
    if _, err := fmt.Scanf("%d", &n); err != nil {
        fmt.Printf("Scanf n: %v, input error\n", n)
        return
    }
    
    for i := 0; i < n; i++ {
        // 输入积木类型和数量
        blockType, quantity := "", 0
        if _, err := fmt.Scanf("%s %d", &blockType, &quantity); err != nil {
            fmt.Printf("Scanf blockType: %v, quantity: %v, input error\n", blockType, quantity)
            return
        }
        
        block, err := BlockFactory(blockType)
        if err != nil {
            fmt.Printf("BlockFactory blockType: %v, err: %v\n", blockType, err)
            return
        }
        
        for j := 0; j < quantity; j++ {
            fmt.Println(block.produce())
        }
    }
}
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值