做網(wǎng)站要注意哪些長春網(wǎng)絡(luò)優(yōu)化最好的公司
【設(shè)計(jì)模式專題之工廠方法模式】2.積木工廠
?
題目描述
小明家有兩個(gè)工廠,一個(gè)用于生產(chǎn)圓形積木,一個(gè)用于生產(chǎn)方形積木,請你幫他設(shè)計(jì)一個(gè)積木工廠系統(tǒng),記錄積木生產(chǎn)的信息。
?
輸入描述
輸入的第一行是一個(gè)整數(shù) N(1 ≤ N ≤ 100),表示生產(chǎn)的次數(shù)。
接下來的 N 行,每行輸入一個(gè)字符串和一個(gè)整數(shù),字符串表示積木的類型。積木類型分為 “Circle” 和 “Square”
兩種。整數(shù)表示該積木生產(chǎn)的數(shù)量
?
輸出描述
對(duì)于每個(gè)積木,輸出一行字符串表示該積木的信息。
?
輸入示例
3
Circle 1
Square 2
Circle 1
?
輸出示例
Circle Block
Square Block
Square Block
Circle Block
?
提示信息
在示例中,積木工廠生產(chǎn)了4塊積木,其中有2塊是圓形積木,2塊是方形積木。
根據(jù)輸入的類型,每塊積木的信息被輸出到控制臺(tái)。
思路
- 先聲明接口
Block
,不同積木類型,實(shí)現(xiàn)該接口 - 圓形&方形 積木,實(shí)現(xiàn)上述Block接口提供的方法
produce
- 實(shí)現(xiàn)一個(gè)積木生產(chǎn)工廠
BlockFactory
,用于生成不同形狀的積木對(duì)象 main
函數(shù)中,按要求,批量生產(chǎn)對(duì)應(yīng)積木
注意
- 字符串常量,統(tǒng)一整理歸類放在開頭處
BlockFactory
考慮默認(rèn)情況default
Golang版本代碼:
package mainimport ("fmt"
)const (StrTypeCircle = "Circle" // 類型:圓形StrTypeSquare = "Square" // 類型:方形StrCircleBlock = "Circle Block" // 輸出:圓形積木StrSquareBlock = "Square Block" // 輸出:方形積木
)// Block 聲明接口,不同積木類型,實(shí)現(xiàn)該接口
type Block interface {produce() string
}// CircleBlock
type CircleBlock struct {}// produce
func (b CircleBlock) produce() string { // 注意返回stirng類型return StrCircleBlock
}// SquareBlock
type SquareBlock struct{}// produce 實(shí)現(xiàn)square接口
func (b SquareBlock) produce() string {return StrSquareBlock
}// BlockFactory 積木生產(chǎn)工廠
func BlockFactory(blockType string) (Block, error) {switch blockType {case StrTypeCircle:return CircleBlock{}, nilcase StrTypeSquare:return SquareBlock{}, nildefault:return nil, fmt.Errorf("input blockType error")}
}func main() {// 輸入生產(chǎn)次數(shù)n := 0if _, err := fmt.Scanf("%d", &n); err != nil {fmt.Printf("Scanf n: %v, input error\n", n)return}for i := 0; i < n; i++ {// 輸入積木類型和數(shù)量blockType, quantity := "", 0if _, 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())}}
}