您的位置 首页 golang

《Golang学习数据结构和算法》中文版 第6篇

《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  

让我们在下一节看看私有类和代理数据模式。

上一篇:

文章来源:智云一二三科技

文章标题:《Golang学习数据结构和算法》中文版 第6篇

文章地址:https://www.zhihuclub.com/98195.shtml

关于作者: 智云科技

热门文章

网站地图