參考:【設計模式專題之單例模式】1.小明的購物車
【設計模式專題之單例模式】
1.小明的購物車 時間限制:1.000S 空間限制:256MB
?
題目描述
小明去了一家大型商場,拿到了一個購物車,并開始購物。請你設計一個購物車管理器,記錄商品添加到購物車的信息(商品名稱和購買數量),并在購買結束后打印出商品清單。(在整個購物過程中,小明只有一個購物車實例存在)。
?
輸入描述
輸入包含若干行,每行包含兩部分信息,分別是商品名稱和購買數量。商品名稱和購買數量之間用空格隔開。
?
輸出描述
輸出包含小明購物車中的所有商品及其購買數量。每行輸出一種商品的信息,格式為 “商品名稱 購買數量”。
?
輸入示例
Apple 3 Banana 2 Orange 5
?
輸出示例
Apple 3 Banana 2 Orange 5
?
提示信息
- 本道題目請使用單例設計模式
- 使用私有靜態變量來保存購物車實例
- 使用私有構造函數防止外部直接實例化
思路:
- 單例實現,借助Golang中的 sync.Once 包 和 全局變量 實現
- 先實現幾個必要結構、實例和方法,結構體 如:商品信息、購物車信息;實例 如:購物車實例;方法 如:
Set
和Get
方法。
注意:
Set
方法,需要修改接收器指向的購物車中的商品信息,因此需要使用指針接收器Get
方法,需要讀取購物車中的商品信息,無需修改,所以可以使用值接收器。這樣在調用Get方法時,會創建接收器的副本,而不會影響原始購物車實例。main
方法,外部自定義格式的輸入方式,應由外部處理,而不應放入Set方法中處理,避免Set方法因外部輸入格式變動而頻繁改動
Golang版本代碼:
package mainimport (
"fmt"
"sync"
)// 單例 全局變量
var (instance *ShoppingCartInfoonce sync.Once
)// ProductInfo 商品信息
type ProductInfo struct {Name stringQuantity int
}// ShoppingCart 購物車信息
type ShoppingCartInfo struct {shoppingCart []ProductInfo
}// NewInstance 新建購物車實例
func NewInstance() *ShoppingCartInfo {once.Do(func() {instance = &ShoppingCartInfo{shoppingCart: make([]ProductInfo, 0),}})return instance
}// Set 添加購物車商品信息
// Set方法,需要修改接收器指向的購物車中的商品信息,因此需要使用指針接收器
func (m *ShoppingCartInfo) Set(info ProductInfo) {m.shoppingCart = append(m.shoppingCart, info)
}// Get 獲取購物車商品信息
// Get方法,需要讀取購物車中的商品信息,無需修改,所以可以使用值接收器。
// 這樣在調用Get方法時,會創建接收器的副本,而不會影響原始購物車實例。
func (m ShoppingCartInfo) Get() {for _, info := range m.shoppingCart {fmt.Println(info.Name, info.Quantity)}
}// main
func main() {ins := NewInstance()name, quantity := "", 0// 模擬多次添加購物車商品for {// 外部自定義格式的輸入方式,應由外部處理,而不應放入Set方法中處理,避免Set方法因外部輸入格式變動而頻繁改動if _, err := fmt.Scanf("%s %d", &name, &quantity); err != nil {break}ins.Set(ProductInfo{Name: name,Quantity: quantity,})}// 最后一次性獲取購物車所有商品信息ins.Get()
}