Go语言程序设计(三)
对象池模式
The object pool creational design pattern is used to prepare and keep multiple instances according to the demand expectation.
实例:
package main
import (
"fmt"
"strconv"
"time"
)
type Pool chan *Object
type Object struct {
name string
}
func New(total int) *Pool {
p := make(Pool, total)
for i := 0; i < total; i++ {
p <- &Object{name:strconv.Itoa(i)}
}
return &p
}
func main() {
p := New(2)
for {
select {
case obj := <- *p:
fmt.Println(obj.name)
//time.Sleep(2*time.Second)
*p <- obj
time.Sleep(1*time.Second)
//default:
// return
}
}
}
Builder Pattern 建造者模式
Builder pattern separates the construction of a complex object from its representation so that the same construction process can create different representations.
In Go, normally a configuration struct is used to achieve the same behavior, however passing a struct to the builder method fills the code with boilerplate if cfg.Field != nil {...} checks.
实例代码:
package main
import "fmt"
// 创建speed类型
type Speed float64
const (
MPH Speed = 1
KPH = 1.60934
)
// 创建颜色类型
type Color string
const (
BlueColor Color = "blue"
GreenColor = "green"
RedColor = "red"
)
// 创建轮胎类型
type Wheels string
const (
SportsWheels Wheels = "sports"
SteelWheels = "steel"
)
// 创建car需要的工序,最后通过build创建
type Builder interface {
Color(Color) Builder
Wheels(Wheels) Builder
TopSpeed(Speed) Builder // 创建属性
Build() Interface // 创建动作
}
// 返回的接口体具备如下方法
type Interface interface {
Drive() error
Stop() error
}
type Car struct {
Name string
Wheel Wheels
Speeds Speed
Colors Color
}
// 返回一个car实例的接口
func NewBuilder() Builder {
return &Car{ // 必须是指针,因为后面的函数都是使用指针,只有指针的Car才能调用所有实现了的方法
Name: "",
Wheel: "",
Speeds: 0,
Colors: "",
}
}
// Builder接口实现
func (p *Car) Color(color Color) Builder{
p.Colors = color
return p
}
func (p *Car) Wheels(Wheel Wheels) Builder{
p.Wheel = Wheel
return p
}
func (p *Car) TopSpeed(S Speed) Builder{
p.Speeds = S
return p
}
func (p *Car) Build() Interface {
return p
}
func (p *Car) Drive() error {
fmt.Println("I'm running...",p.Speeds,p.Speeds,p.Wheel,p.Colors)
return nil
}
func (p *Car) Stop() error {
fmt.Println("I'm stopping...",p.Name,p.Speeds,p.Wheel,p.Colors)
return nil
}
func main() {
// 通过链式编程来给实例的过程赋值属性和动作,需要注意的是,这些都是通过接口的方式进行约束,所以必须实现。
car := NewBuilder().Color(BlueColor).Wheels(SportsWheels).TopSpeed(MPH).Build()
car.Drive()
}
Factory Method Pattern 工厂化方法模式
Factory method creational design pattern allows creating objects without having to specify the exact type of the object that will be created. 工厂方法创建设计模式允许创建对象,而不必指定将要创建的对象的确切类型。根据不同的情况创建不同的对象方法
代码如下:
package main
import (
"bufio"
"fmt"
"strings"
)
type StorageType int
const (
MemoryStorage StorageType = 1 << iota
TempStorage
)
type Store interface {
Open(string) (error)
}
type MemoryStorages struct {
data string
}
func newMemoryStorage(s string) *MemoryStorages {
return &MemoryStorages{data: s}
}
func (p *MemoryStorages) Open(s string) error {
sr := strings.NewReader(p.data)
r := bufio.NewReader(sr)
line, _, err := r.ReadLine()
if err != nil {
return err
}
fmt.Println(string(line))
return nil
}
type TempStorageS struct {
data string
}
func newTempStorage(s string) *TempStorageS {
return &TempStorageS{data:s}
}
func (p *TempStorageS) Open(s string) error {
sr := strings.NewReader(p.data)
r := bufio.NewReader(sr)
line, _, err := r.ReadLine()
if err != nil {
return err
}
fmt.Println(line)
return nil
}
// 根据定义的类型,传入不同的参数创建不同的对象实现方法
func NewStore(t StorageType) Store {
switch t {
case MemoryStorage:
return newMemoryStorage("Memory\n....")
case TempStorage:
return newTempStorage("openfile")
default:
return newMemoryStorage("default\n....")
}
}
func main() {
memory := NewStore(1)
memory.Open("start")
}

浙公网安备 33010602011771号