【设计模式专题之工厂方法模式】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块是方形积木。根据输入的类型,每块积木的信息被输出到控制台。
思路
- 先声明接口
Block
,不同积木类型,实现该接口 - 圆形&方形 积木,实现上述Block接口提供的方法
produce
- 实现一个积木生产工厂
BlockFactory
,用于生成不同形状的积木对象 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())
}
}
}