forked from go/golangs_learn
				
			
				 2 changed files with 92 additions and 0 deletions
			
			
		@ -0,0 +1,52 @@ | 
				
			|||||
 | 
					
 | 
				
			||||
 | 
					```go | 
				
			||||
 | 
					package abstract_factory | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import "fmt" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					type Lunch interface { | 
				
			||||
 | 
						Cook() | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					type Rise struct { | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					func (r *Rise) Cook() { | 
				
			||||
 | 
						fmt.Println("这是 测试1111。") | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					type Tomato struct { | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					func (t *Tomato) Cook() { | 
				
			||||
 | 
						fmt.Println("这是 测试22222。") | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					type LunchFactory interface { | 
				
			||||
 | 
						CreateFood() Lunch | 
				
			||||
 | 
						CreateVegetable() Lunch | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					type SimpleLunchFactory struct { | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					func NewSimpleLunchFactory() LunchFactory { | 
				
			||||
 | 
						return &SimpleLunchFactory{} | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					func (s *SimpleLunchFactory) CreateFood() Lunch { | 
				
			||||
 | 
						return &Rise{} | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					func (s *SimpleLunchFactory) CreateVegetable() Lunch { | 
				
			||||
 | 
						return &Tomato{} | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					* 实际抽象工厂是对工程的工厂函数的再次接口抽象 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					* `type Lunch interface { Cook() }` 声明接口,声明`type Rise struct {}` 和 `type Tomato struct {}` 结构体,通过结构体声明接口函数,使得实现接口,从而实现多态。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					* `type LunchFactory interface { CreateFood() Lunch; CreateVegetable() Lunch }` 声明一个接口,接口中存在不同函数,用于返回不同对象,是对 原 *工厂模式* 升级,使 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					* 通过工厂函数,通过调用不同的接口函数,调用不同接口实现,完成(接口)多态调用。而工厂函数返回实际对象,从而使用实际对象,调用接口具体实现。 | 
				
			||||
@ -0,0 +1,40 @@ | 
				
			|||||
 | 
					
 | 
				
			||||
 | 
					```go | 
				
			||||
 | 
					package factory | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import ( | 
				
			||||
 | 
						"fmt" | 
				
			||||
 | 
					) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					type Restaurant interface { | 
				
			||||
 | 
						GetFood() | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					type Aa struct { | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					type Bb struct { | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					func (a *Aa) GetFood() { | 
				
			||||
 | 
						fmt.Println("Aa ... 测试工厂生产, ", &a) | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					func (b *Bb) GetFood() { | 
				
			||||
 | 
						fmt.Println("Bb ... 测试工厂生产, ", &b) | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					func NewRestaurant(name string) Restaurant { | 
				
			||||
 | 
						switch name { | 
				
			||||
 | 
						case "Aa": | 
				
			||||
 | 
							return &Aa{} | 
				
			||||
 | 
						case "Bb": | 
				
			||||
 | 
							return &Bb{} | 
				
			||||
 | 
						} | 
				
			||||
 | 
						return nil | 
				
			||||
 | 
					} | 
				
			||||
 | 
					``` | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					* `type Restaurant interface { GetFood() }` 声明接口,声明`type Aa struct {}` 和 `type Bb struct {}` 结构体,通过结构体声明接口函数,使得实现接口,从而实现多态。 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					* 通过工厂函数,通过不同参数,调用不同接口实现,完成(接口)多态调用。而工厂函数返回实际对象,从而使用实际对象,调用接口具体实现。 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue