当前位置: 首页 > news >正文

临沂做商城网站的公司做美篇发网站

临沂做商城网站的公司,做美篇发网站,宣传类网站,邢台网站制作有哪些目录 建造者模式(Builder Pattern) 建造者模式的核心角色 优缺点 使用场景 注意事项 代码实现 建造者模式(Builder Pattern) 建造者模式(Builder Pattern)是将一个复杂对象的构建与它的表示分离&…

目录

建造者模式(Builder Pattern)  

建造者模式的核心角色

优缺点

使用场景

注意事项

代码实现


建造者模式(Builder Pattern)  

       建造者模式(Builder Pattern)是将一个复杂对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

建造者模式的核心角色

        1、抽象建造者(Builder):是为创建一个Product对象的各个部件指定的抽象接口。

        2、具体建造者(ConcreteBuilder):实现Builder接口,构造和装配各个部件。

        3、指挥者(Director):是构建一个实用Builder接口的对象。一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。

        4、产品角色(Product):具体的产品

优缺点

(1)优点:

  • 分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
  • 可以更好地控制构建过程,隐藏具体构建细节。
  • 代码复用性高,可以在不同的构建过程中重复使用相同的建造者。

(2)缺点:

  • 如果产品的属性较少,建造者模式可能会导致代码冗余。
  • 建造者模式增加了系统的类和对象数量。

使用场景

        建造者模式在创建复杂对象时非常有用,特别是当对象的构建过程涉及多个步骤或参数时。它可以提供更好的灵活性和可维护性,同时使得代码更加清晰可读。

  • 需要生成的对象具有复杂的内部结构。
  • 需要生成的对象内部属性本身相互依赖

注意事项

        与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

代码实现

package mainimport ("errors""fmt"
)// Product内的参数
type ResourceParams struct {name     stringmaxTotal int64maxIdle  int64minIdle  int64
}// Product接口
type ResourceProduct interface {show()
}// 实际Product,有show函数
type RedisResourceProduct struct {resourceParams ResourceParams
}// show成员函数,用于显示product的参数内容
func (p *RedisResourceProduct) show() {fmt.Printf("Product的数据为 %+v ", p.resourceParams)
}// 资源类创建接口
type ResourceBuilder interface {setName(name string) ResourceBuildersetMaxTotal(maxTotal int64) ResourceBuildersetMaxIdle(maxIdle int64) ResourceBuildersetMinIdle(minIdle int64) ResourceBuildergetError() errorbuild() (p ResourceProduct)
}// 实际建造者
type RedisResourceBuilder struct {resourceParams ResourceParamserr            error
}// 设置名称
func (r *RedisResourceBuilder) setName(name string) ResourceBuilder {if name == "" {r.err = errors.New("name为空")return r}r.resourceParams.name = namefmt.Println("RedisResourceBuilder setName ", name)return r
}// 设置maxTotal值,值不能小于0
func (r *RedisResourceBuilder) setMaxTotal(maxTotal int64) ResourceBuilder {if maxTotal <= 0 {r.err = errors.New("maxTotal小于0")return r}r.resourceParams.maxTotal = maxTotalfmt.Println("RedisResourceBuilder setMaxTotal ", maxTotal)return r
}// 设置maxIdle值,值不能小于0
func (r *RedisResourceBuilder) setMaxIdle(maxIdle int64) ResourceBuilder {if maxIdle <= 0 {r.err = errors.New("maxIdle小于0")return r}r.resourceParams.maxIdle = maxIdlefmt.Println("RedisResourceBuilder setMaxIdle ", maxIdle)return r
}// 设置minIdle值,值不能小于0
func (r *RedisResourceBuilder) setMinIdle(minIdle int64) ResourceBuilder {if minIdle <= 0 {r.err = errors.New("minIdle小于0")return r}r.resourceParams.minIdle = minIdlefmt.Println("RedisResourceBuilder setMinIdle ", minIdle)return r
}// 获取错误信息
func (r *RedisResourceBuilder) getError() error {return r.err
}// 构建product: 1. 做参数校验  2. 根据参数生成product
func (r *RedisResourceBuilder) build() (p ResourceProduct) {// 校验逻辑放到这里来做,包括必填项校验、依赖关系校验、约束条件校验等if r.resourceParams.name == "" {r.err = errors.New("name为空")return}if !((r.resourceParams.maxIdle == 0 && r.resourceParams.minIdle == 0 && r.resourceParams.maxTotal == 0) ||(r.resourceParams.maxIdle != 0 && r.resourceParams.minIdle != 0 && r.resourceParams.maxTotal != 0)) {r.err = errors.New("数据需要保持一致")return}if r.resourceParams.maxIdle > r.resourceParams.maxTotal {r.err = errors.New("maxIdle > maxTotal")return}if r.resourceParams.minIdle > r.resourceParams.maxTotal || r.resourceParams.minIdle > r.resourceParams.maxIdle {r.err = errors.New("minIdle > maxTotal|maxIdle")return}fmt.Println("RedisResourceBuilder build")product := &RedisResourceProduct{resourceParams: r.resourceParams,}return product
}// 指挥者
type Director struct {
}// 指挥者控制建造过程
func (d *Director) construct(builder ResourceBuilder) ResourceProduct {resourceProduct := builder.setName("redis").setMinIdle(10).setMaxIdle(10).setMaxTotal(20).build()err := builder.getError()if err != nil {fmt.Println("构建失败,原因为" + err.Error())return nil}return resourceProduct
}func main() {builder := &RedisResourceBuilder{}director := &Director{}product := director.construct(builder)if product == nil {return}product.show()
}
http://www.yayakq.cn/news/339883/

相关文章:

  • 优化seo网站广东汕头新闻最新消息
  • 备案号 网站开发区人才市场官网
  • 无锡营销型网站婚纱摄影网站html模板
  • 建筑公司网站领导致辞网站备案认领
  • 个人主页网站htmlwordpress左侧导航
  • 安阳宁波seo网站推广
  • 外贸网站建设注意wordpress星座
  • 常州手机网站效果wordpress 推送 微信
  • 创建网站需要多少钱个人网站做企业网站
  • 合肥微信网站制作微信营销管理软件
  • 梅州东莞网站建设广州市门户网站建设
  • 益阳网站建设网站建设概述
  • 南京做中英文网站做电影网站程序好用
  • 天津建设工程评标专家网站wordpress需要会php吗
  • 手机建站网站wordpress ico
  • 泰安建设信息网站如何做公司的英文网站
  • 网站如何申请微信支付接口建网站 3年服务
  • 网站结构规划app脚本制作教程
  • 2013年以前pc网站建设呼市做无痛人流z首大网站
  • 电商网站开发书籍晋江文学城电脑版
  • wordpress网站app个人备案网站可以做支付吗
  • 电子商务网站和普通网站的区别没有公司个人可以做网站卖东西吗
  • 太原网站开发公司网站建设服务费怎么做账
  • 南京做网站建设有哪些内容建设银行手机银行网站登录
  • 网站开发前端和后端怎么连接wordpress登录注册代码
  • 网站域名详解焦作网站开发
  • 网站去版权淘宝网页设计教程
  • 设计模板网站佛山网站建设公司电话
  • 冀州做网站的公司360免费wifi下载安装
  • 后海做网站公司西安公司网站建设哪家专业