《Learn Data struct ures and Algorithms with Golang》作者: Bhagvan Kommadi
享元(Flyweight)
享元用来管理一个带有高度变化对象的状态。这个模式允许我们多个对象之间共享对象状态的公共部分,而不是共享存储它的每个对象。变化的对象数据看做外部状态,而对象状态的其余部分是内部状态。外部数据被传给享元方法且不会被存储在对象里。 享元模式 有助于减少整体内存使用和对象初始化开销。此模式有助于创建类之间关系和降低内存到可管理水平。
享元对象是不可变的。值对象是一个享元模式的好例子。享元对象可以创建在单独线程模式里,确保每个值一个实例。在并发线程场景里会创建很多实例。这是基于享元对象的平等标准。
享元模式的参与者是FlyWeight接口,ConcreteFlyWeight类,FlyWeightFactory类型和Client类:
- FlyWeight接口有一个方法,通过此方法flyweights可以得到外部状态和对它起作用。
- ConcreteFlyWeight实现FlyWeight接口来表示享元对象。
- FlyWeightFactory类用来创建和管理享元对象。客户端调用FlyWeightFactory得到一个享元对象。UnsharedFlyWeight有一个禁用共享功能。
- Client类
让我们假设DataTransferObject是带有getId方法的接口。DataTransferObjectFactory创建一个数据传输对象通过带DTO类型参数的getDataTransferObject方法。 dto 类型包括客户,员工,管理者和地址,如下代码所示:
//main package has examples shown
// in Hands-On Data Structures and algorithms with Go book
package main
// importing fmt package
import (
"fmt"
)
//DataTransferObjectFactory struct
type DataTransferObjectFactory struct {
pool map[string] DataTransferObject
}
//DataTransferObjectFactory class method getDataTransferObject
func (factory DataTransferObjectFactory) getDataTransferObject(dtoType string) DataTransferObject {
var dto = factory.pool[dtoType]
if dto == nil {
fmt.Println("new DTO of dtoType: " + dtoType)
switch dtoType{
case "customer":
factory.pool[dtoType] = Customer{id:"1"}
case "employee":
factory.pool[dtoType] = Employee{id:"2"}
case "manager":
factory.pool[dtoType] = Manager{id:"3"}
case "address":
factory.pool[dtoType] = Address{id:"4"}
}
dto = factory.pool[dtoType]
}
return dto
}
在下面代码里,DataTransferObject接口由Customer类实现:
// DataTransferObject interface
type DataTransferObject interface {
getId() string
}
//Customer struct
type Customer struct {
id string //sequence generator
name string
ssn string
}
// Customer class method getId
func (customer Customer) getId() string {
//fmt.Println("getting customer Id")
return customer.id
}
//Employee struct
type Employee struct {
id string
name string
}
//Employee class method getId
func (employee Employee) getId() string {
return employee.id
}
//Manager struct
type Manager struct {
id string
name string
dept string
}
DataTransferObject接口由Manager类实现,代码如下:
//Manager class method getId
func (manager Manager) getId() string {
return manager.id
}
//Address struct
type Address struct {
id string
streetLine1 string
streetLine2 string
state string
city string
}
//Address class method getId
func (address Address) getId() string{
return address.id
}
//main method
func main() {
var factory = DataTransferObjectFactory{make(map[string]DataTransferObject)}
var customer DataTransferObject = factory.getDataTransferObject("customer")
fmt.Println("Customer ",customer.getId())
var employee DataTransferObject = factory.getDataTransferObject("employee")
fmt.Println("Employee ",employee.getId())
var manager DataTransferObject = factory.getDataTransferObject("manager")
fmt.Println("Manager",manager.getId())
var address DataTransferObject = factory.getDataTransferObject("address")
fmt.Println("Address",address.getId())
}
运行下面的命令:
go run flyweight.go
让我们在下一节看看私有类和代理数据模式。
上一篇: