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())  }

整体效果如下: