教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang设计模式之抽象工厂模式

Golang设计模式之抽象工厂模式

发布时间:2022-03-01   编辑:jiaochengji.com
教程集为您提供Golang设计模式之抽象工厂模式等资源,欢迎您收藏本站,我们将为您提供最新的Golang设计模式之抽象工厂模式资源
<h1>抽象工厂模式</h1>

GitHub代码链接

抽象工厂模式(Abstra Factory Pattern)是围绕一个超级工厂,创建其他的工厂。这种类型的设计模式属于创建型模式。

<h2>抽象工厂解决的问题</h2>

在工厂模式中,一个具体的工厂对应一种具体的产品。但是,有时候我们需要工厂可以提供多个产品对象,而不是单一产品对象。
我们首先要理解两个概念

<ul><li> 产品等级结构 产品的等级结构就是产品的继承结构,如一个模型工厂,可以画出圆形,长方形和正方形的模型。这里抽象的模型工厂和具体的模型构成了产品等级结构。</li> <li> 产品族 在抽象工厂模式中,产品族指的是同一个工厂生产的,位于不同产品等级结构的一组产品。如模具厂生产的红色圆形模具,圆形模型属于模型产品等级结构中,红色属于颜料产品等级结构中。</li> </ul>

例如我们的衣服,上衣由一个工厂生产,有卫衣,有衬衫,有西服。裤子由一个工厂生产,有短裤,有休闲裤,有西裤。这样,不同的上衣和不同的裤子组合起来,就是成了一套衣服,
就像QQ秀一样,当你在商城买了一套衣服裤子的时候,就是由这个抽象工厂所生产的。抽象工厂从几个具体的工厂中获取衣服,裤子,帽子等。组合成一套进行成套的售卖。

<h3>优点</h3>

当一个产品族中多个对象被设计成一起工作时,它可以保证客户始终只使用同一个产品族中的对象

<h3>缺点</h3>

产品族拓展非常困难,需要修改很多代码

<h2>抽象工厂实现</h2> <h3>1.1 设计接口</h3>

设计一个模型接口和色彩接口

<pre><code class="lang-golang hljs">//Shape 模型接口 type Shape interface { Draw() } //Color 色彩接口 type Color interface { Fill() } </code></code></pre> <h3>1.2 实现模型类</h3> <pre><code class="lang-golang hljs">//Circle 实现模型接口的圆形类 type Circle struct{} //Square 实现模型接口的正方形类 type Square struct{} //Draw Circle类的Draw方法 func (c Circle) Draw() { fmt.Println("Circle Draw() method") } //Draw Square类的Draw方法 func (s Square) Draw() { fmt.Println("Square Draw() method") } </code></code></pre> <h3>1.3 实现色彩类</h3> <pre><code class="lang-golang hljs">//Red 实现色彩接口的红色类 type Red struct{} //Green 实现色彩接口的绿色类 type Green struct{} //Fill 红色类的Fill方法 func (r Red) Fill() { fmt.Println("Red Fill() method") } //Fill 绿色类的Fill方法 func (g Green) Fill() { fmt.Println("Green Fill() method") } </code></code></pre> <h3>1.4 设计抽象工厂接口</h3> <pre><code class="lang-golang hljs">//AbstractFactory 抽象工厂接口 type AbstractFactory interface { GetShape(shapeName string) Shape GetColor(colorName string) Color } </code></code></pre> <h3>1.5 根据抽象工厂的接口实现具体工厂类</h3> <pre><code class="lang-go hljs">//ShapeFactory 模型工厂的类 type ShapeFactory struct{} //ColorFactory 色彩工厂的类 type ColorFactory struct{} //GetShape 模型工厂实例获取模型子类的方法 func (sh ShapeFactory) GetShape(shapeName string) Shape { switch shapeName { case "circle": return &Circle{} case "square": return &Square{} default: return nil } } //GetColor 模型工厂实例不需要色彩方法 func (sh ShapeFactory) GetColor(colorName string) Color { return nil } //GetShape 色彩工厂实例不需要获取模型方法 func (cf ColorFactory) GetShape(shapeName string) Shape { return nil } //GetColor 色彩工厂实例,获取具体色彩子类 func (cf ColorFactory) GetColor(colorName string) Color { switch colorName { case "red": return &Red{} case "green": return &Green{} default: return nil } } </code></code></pre> <h3>1.6 实现一个超级工厂</h3>

超级工厂用于获取模型工厂或者色彩工厂实例

<pre><code class="lang-golang hljs">//FactoryProducer 超级工厂类,用于获取工厂实例 type FactoryProducer struct{} //GetFactory 获取工厂方法 func (fp FactoryProducer) GetFactory(factoryname string) AbstractFactory { switch factoryname { case "color": return &ColorFactory{} case "shape": return &ShapeFactory{} default: return nil } } //NewFactoryProducer 创建FactoryProducer类 func NewFactoryProducer() *FactoryProducer { return &FactoryProducer{} } </code></code></pre> 到此这篇关于“ Golang设计模式之抽象工厂模式”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang设计模式之抽象工厂模式
java设计模式之抽象工厂模式实例
深入php设计模式实例详解
java工厂模式的学习笔记
php工厂模式实例代码
JavaScript设计模式一:工厂模式和构造器模式
C# 设计模式之Abstract Factory 抽象工厂(概念)
php常用设计模式之工厂模式与单例模式介绍
php设计模式实例之工厂模式
JavaScript 设计模式读书笔记(五)——工厂模式

[关闭]
~ ~