首页 > 其他分享 >享元模式

享元模式

时间:2022-09-19 09:56:29浏览次数:54  
标签:享元 return string color 模式 func name

享元模式

享元接口

package flyweight

type flyWeight interface{
    setColor(string)
    getShape()string
}

享元角色

package flyweight

type shape struct {
    name string
    color string
}

享元角色圆形

package flyweight

import "fmt"

var circle *Circle

type Circle struct {
	shape
}

func NewCircle() *Circle {
	if circle == nil {
		circle = &Circle{}
		circle.name = "圆形"
	}
	return circle
}

func (c *Circle) setColor(color string) {
	c.color = color
}

func (c *Circle) getShape() string {
	return c.name
}

func (c *Circle) String() string {
	return fmt.Sprintf("形状为:%s,颜色为:%s", c.name, c.color)
}

享元角色长方形

package flyweight

import "fmt"

var rect *Rectangle

type Rectangle struct {
	shape
}

func NewRectangle() *Rectangle {
	if rect == nil {
		rect = &Rectangle{}
		rect.name = "长方形"
	}
	return rect
}

func (r *Rectangle) setColor(color string) {
	r.color = color
}

func (r *Rectangle) getShape() string {
	return r.name
}

func (r *Rectangle) String() string {
	return fmt.Sprintf("形状为:%s,颜色为:%s", r.name, r.color)
}

享元工厂

package flyweight

import "sync"

var (
	factory *FlyWeightFactory
	once    sync.Once
)

type FlyWeightFactory struct {
	hash map[string]flyWeight
}

func NewFactory() *FlyWeightFactory {
	once.Do(func() {
		factory = &FlyWeightFactory{
			hash: make(map[string]flyWeight),
		}
	})
	return factory
}

func (f *FlyWeightFactory) Get(name string) flyWeight {
	if _, ok := f.hash[name]; !ok {
		var sp flyWeight
		switch name {
		case "圆形":
			sp = NewCircle()
			f.hash[name] = sp
		case "长方形":
			sp = NewRectangle()
			f.hash[name] = sp
		}
	}
	return f.hash[name]
}

测试文件

package flyweight

import (
	"fmt"
	"testing"
)

func TestFlyWeight(t *testing.T) {
	fac := NewFactory()
	s1 := fac.Get("长方形")
	s1.setColor("红色")
	fmt.Println(s1)

    s2 := fac.Get("圆形")
    s2.setColor("绿色")
    fmt.Println(s2)
}

标签:享元,return,string,color,模式,func,name
From: https://www.cnblogs.com/mathsmouse/p/16706702.html

相关文章

  • 设计模式之备忘录模式
    无论是我们在使用word还是记事本,系统都会为我们提供撤销的功能,这几乎是人人都会使用到的功能,而在我们实际开发中,会不会存在一个很复杂的对象,当更改了其中的某一个属性以后,......
  • cypress无头模式运行,生成测试报告
    1.内置测试报告 npxcypressrun--reporter=spec2.指定运行用例  npxcypressrun--reporter=spec--speccypress\integration\cypress-study\web\page\should_de......
  • 我的设计模式之旅、02 单例模式(第二次更新)
    编程旅途是漫长遥远的,在不同时刻有不同的感悟,本文会一直更新下去。思考总结什么是单例模式单例模式(SingletonPattern)属于创建型模式,它提供了一种创建对象的最佳方式。......
  • 我的设计模式之旅、12 原型模式
    编程旅途是漫长遥远的,在不同时刻有不同的感悟,本文会一直更新下去。思考总结思考问题如果没有原型模式,当我们复制复杂对象,在新建相同类的对象,遍历原始对象中的所有成员变......
  • 我的设计模式之旅、11 生成器(建造者)模式
    编程旅途是漫长遥远的,在不同时刻有不同的感悟,本文会一直更新下去。思考总结思考问题没有生成器模式的情况下在构建不同形式的复杂对象时的问题:如果为每种可能的对象都......
  • 串的模式匹配算法
    一、算法设计思想1.简单模式匹配算法从主串的第一个位置开始和模式串的第一个字符开始比较,相等继续比较下一个字符;否则从主串的下一个字符和模式串的第一个字符重新开始......
  • 设计模式
    知识点脑图  一、策略模式https://blog.csdn.net/SK_study/article/details/122404194 ......
  • C检测大小端模式
    int1234567800001100001000100011100001001110大端char小端char#include<stdio.h>#include<stdlib.h>intmain(){ unionTestUnion { inta; char......
  • 中介者模式
    抽象中介者(Mediator):抽象中介者角色定义统一的接口,用于各同事角色之间的通信。抽象同事类(Colleague):每一个同事角色都知道中介者角色,而且与其它的同事角色通信的时候,一定......
  • 状态模式
    上下文(Context):也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。抽象状态(State):定义一个接口,用以封装环境对象中的特定状态所对应的......