• golang 工厂模式


    随笔背景

    某一天询问某大牛--贺某人。询问golang为啥没有构造函数。他给我的回复就是,为啥要有构造函数,给爷爷我写清楚点,不要啥都写隐式标识!!把我一顿怼!(注:不用担心,我被怼很有经验。)然后我就亮出了我的王牌我知道你背着你老婆看小姐姐的证据” (注:他老婆也是好朋友,本人善于告状!)。被逼无奈之下,告诉了我别的方法。如图:

    仔细一想:这他妈不是工厂模式,初始化版V1.0吗?

    于实抱着学习的态度用golang实现一下简单工厂方法工厂抽象工厂三种设计模式。

    1、简单工厂:

    第一步:创建一个文章接口,需要实现阅读和写作的功能。

    type Article interface {
    	ReadArticle() string
    	WriteArticle(contents string) string
    }
    

    第二步:创建 中文书英文书 两个“类”,并且分别实现两种方法。(注:golang种没有类,只有组合。应贺总强调,特别说明)

    type ChineseArticle struct{}
    type EnglishArticle struct{}
    
    func (c *ChineseArticle) ReadArticle() string {
    	return "这是中文字符"
    }
    func (c *EnglishArticle) ReadArticle() string {
    	return "this's English chars"
    }
    func (c *ChineseArticle) WriteArticle(contents string) string {
    	return "写入了文章"
    }
    func (c *EnglishArticle) WriteArticle(contents string) string {
    	return "wirted words"
    }
    

    第三步:使用断言方式分配不同的参数,应该需要使用什么样的方法去实例化具体的类

    func SFactory(lan string) (art Article) {
    	switch lan {
    	case "Chinese":
    		art = &ChineseArticle{}
    	case "English":
    		art = &EnglishArticle{}
    	default:
    		art = &ChineseArticle{}
    	}
    	return art
    }
    

    第四步:使用

    func main() {
    	a := SFactory("Chinese")//这样,我实例化中文书还是英文书都可以了
    	fmt.Println(a.ReadArticle())
    }
    

    总体结构如下图:

    2、方法工厂:

    第一步:同上, 来一个文章接口

    type Article interface {
    	ReadArticle() string
    	WriteArticle(contents string) string
    }
    

    第二步:来两种书。需要实例化的类。并且实现接口

    type ChineseArticle struct{}
    type EnglishArticle struct{}
    //实现读写接口
    func (c *ChineseArticle) ReadArticle() string {
    	return "读书了"
    }
    func (c *EnglishArticle) ReadArticle() string {
    	return "reading books"
    }
    func (c *ChineseArticle) WriteArticle(contents string) string {
    	return "写书了"
    }
    func (c *EnglishArticle) WriteArticle(contents string) string {
    	return "wirting books"
    }
    

    第三步:创建两个用来创建“类”的“类”,以及其方法

    type CreateEnglish struct{}
    type CreateChinese struct{}
    //方法工厂的核心。
    func (cdb *CreateEnglish) CreateArticle() (len *EnglishArticle, err error) {
    	len = &EnglishArticle{}
    	return len, nil
    }
    func (cdb *CreateChinese) CreateArticle() (len *ChineseArticle, err error) {
    	len = &ChineseArticle{}
    	return len, nil
    }
    

    第四步:使用

    func main() {
    	a := &CreateChinese{}
    	art, _ := a.CreateArticle()
    	fmt.Println(art.WriteArticle("123"))
    }
    

    总体结构如下:

    抽象工厂

    第一步:创建一个book,然后再创建一个能够创建book的BookCompany接口。

    type BookCompany interface {
    	Create() Book
    }
    type Book interface {
    	ReadBook() string
    	WriteBook() string
    }
    

    第二步:创建两book 并且实现它

    type EnglishBook struct{}
    type ChineseBook struct{}
    //实现book的功能
    func (c *EnglishBook) ReadBook() string {
    	return "reading a english book"
    }
    func (c *ChineseBook) ReadBook() string {
    	return "读中文书"
    }
    func (c *EnglishBook) WriteBook() string {
    	return "i'am writing"
    }
    func (c *ChineseBook) WriteBook() string {
    	return "我在创作中"
    }
    

    第三步:创建两个印刷厂

    type BeiJinCompany struct{}
    type ShanghaiCompany struct{}
    //一个印刷场刷英语书,一个刷中文书
    func (c *BeiJinCompany) Create() Book {
    	return &EnglishBook{}
    }
    func (c *ShanghaiCompany) Create() Book {
    	return &ChineseBook{}
    }
    

    第四步:用起来

    func main() {
    	var f BookCompany
    	f = new(BeiJinCompany)
    	book := f.Create()
    	fmt.Println(book.ReadBook())
    }
    

    整体效果如下:

  • 相关阅读:
    色氨酸乙酯双三氟甲基磺酰亚胺[TrpC2][Tf2N]离子液体
    MySQL Row size too large (> 8126)
    支持5G LAN的UPF转发模型
    Linux命令
    Java8新特性——Stream API操作
    魔改editormd组件,优化ToC渲染效果
    【Java基础系列】基本数据类型及包装类
    百度地图API-地图初始化及初步使用
    【微信小程序开发】微信小程序、大前端之flex布局方式详细解析
    如何在公司内部统一「数据指标口径」?_光点科技
  • 原文地址:https://www.cnblogs.com/limanman233/p/16117751.html