目录:

  1. 举个栗子
  2. 概念介绍
  3. 使用场景

1.举个栗子

类图

```

@startuml
'https://plantuml.com/class-diagram

class Elephant {
String name
String getName()
}

interface Container {
List<Elephant> elephants
void add(Elephant elephants)
}

class Refrigerator {
List<Elephant> elephants;
void add(Elephant elephants);
}

class Bowl {
List<Elephant> elephants
void add(Elephant elephants)
}

class Box {
List<Elephant> elephants
void add(Elephant elephants)
}

Container <|- Refrigerator
Container <|- Bowl
Container <|- Box

class ContainerFactory {
Container getInstance(String containerType)
}

class ContainerCounter {
Container container
void countTotalNum()
}

class Main {
void main();
}

@enduml

```

2.概念介绍

创建一个中间件来分离创建对象和使用对象的逻辑

优点:

将创建对象的逻辑放在一起

扩展新的相同行为的对象无需修改使用者的逻辑

封装复杂的对象创建逻辑

缺点:

多了一个工厂类

3.使用场景

main.go

```

package main

import (
"dbTest/Builder/factory/container/containerFactory"
"dbTest/Builder/factory/containerCounter"
"dbTest/Builder/factory/elephant"
"fmt"
"time"
)

func main() {
fmt.Println("start add elephant")
elephants := elephant.Elephant{
"rampage",
}
var containerType string
containerType = "refrigerator"
Contains := containerFactory.GetInstance(containerType)
Contains.AddElephant(elephants)
containerCount := containerCounter.ContainerCounter{}
for i := 0; i < 10; i++ {
go containerCount.CounterNum(Contains)
}
time.Sleep(time.Second)
fmt.Println("we are finished, nums:",Contains.GetTotalNum())
}

```

elephat.go

```

package elephant

type Elephant struct {
Name string
}

func (e Elephant) getName() string {
return e.Name
}

```

containerCounter.go

```

package containerCounter

import (
"dbTest/Builder/factory/container/containerInterface"
"fmt"
)

type ContainerCounter struct {

}

func (rc ContainerCounter) CounterNum(container containerInterface.Container) {
fmt.Println("ContainerCounter:",container.GetTotalNum())
return
}

```

containerFactory.go

```

package containerFactory

import (
"dbTest/Builder/factory/container/bowl"
"dbTest/Builder/factory/container/box"
"dbTest/Builder/factory/container/containerInterface"
"dbTest/Builder/factory/container/refrigerator"
)

func GetInstance(containerType string) containerInterface.Container{
switch containerType {
case "bowl":
return &bowl.Bowl{}
case "box":
return &box.Box{}
case "refrigerator":
return &refrigerator.Refrigerator{}
}
return nil
}

```

container.go

```

package containerInterface

import "dbTest/Builder/factory/elephant"

type Container interface {
AddElephant(elephant elephant.Elephant)
GetTotalNum() int
}

```

refrigerator.go

```

package refrigerator

import (
"dbTest/Builder/factory/elephant"
)

// 1、设计为小写字母开头,表示只在network包内可见,限制客户端程序的实例化
type Refrigerator struct {
elephants []elephant.Elephant
}

func (r *Refrigerator) AddElephant(elephants elephant.Elephant) {
r.elephants = append(r.elephants, elephants)
}

func (r *Refrigerator) GetTotalNum() int {
return len(r.elephants)
}

```

box.go

```

package box

import "dbTest/Builder/factory/elephant"

// 1、设计为小写字母开头,表示只在network包内可见,限制客户端程序的实例化
type Box struct {
elephants []elephant.Elephant
}

func (r *Box) AddElephant(elephants elephant.Elephant) {
r.elephants = append(r.elephants, elephants)
}

func (r *Box) GetTotalNum() int {
return len(r.elephants)
}

```

bowl.go

```

package bowl

import "dbTest/Builder/factory/elephant"

// 1、设计为小写字母开头,表示只在network包内可见,限制客户端程序的实例化
type Bowl struct {
elephants []elephant.Elephant
}

func (r *Bowl) AddElephant(elephants elephant.Elephant) {
r.elephants = append(r.elephants, elephants)
}

func (r *Bowl) GetTotalNum() int {
return len(r.elephants)
}

```

Go实现常用软件设计模式二:工厂模式的更多相关文章

  1. 软件设计模式之工厂模式(JAVA)

    什么是工厂模式? 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相 ...

  2. Java开发中常用的设计模式(一)---工厂模式

    一. 准备工作 1. 本文参考自  自己理解的工厂模式,希望对大家有所帮助 二. 开始 以汽车工厂为例,首先有个汽车类的接口 Car,里面有个开车的方法 drive(),然后有个宝马车的类 BMW 和 ...

  3. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  4. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

  5. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  6. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  9. Spring 实现两种设计模式:工厂模式和单态模式(单例模式)

    本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...

  10. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

随机推荐

  1. 项目实践2:使用html和CSS实现图片轮播

    好家伙, 使用html和CSS实现简单的图片切换(轮播图) 来自:(7条消息) 使用CSS实现简单的图片切换(轮播图)_LexingtonCV16的博客-CSDN博客_css实现图片切换 1.首先创建 ...

  2. Linux有趣命令

    通外网 下载使用阿里云镜像源:wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.re ...

  3. HCNP Routing&Switching之IP安全

    前文我们了解了DHCP安全相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16637627.html:今天我们来聊一聊IP安全相关话题: 技术背景 随着 ...

  4. 如何守护数据安全? 这里有一份RDS灾备方案为你支招

    当今世界是一个充满着数据的互联网世界,生活的方方面面都在不断产生着数据,比如出行记录.消费记录.浏览的网页.发送的消息等等.除了文本类型的数据,图像.音乐.声音都是数据.对于企业而言,数据更是重要的生 ...

  5. KingbaseES blob 类型数据导入导出

    KingbaseES兼容了oracle的blob数据类型.通常是用来保存二进制形式的大数据,也可以用来保存其他类型的数据. 下面来验证一下各种数据存储在数据库中形式. 建表 create table ...

  6. CentOS7_SSH_安装总结

    在使用ssh 连接自己的centos 虚拟机时,发现连接不上,于是有了这个安装过程 (以下是在root用户下执行的,没权限的话就sudo) 1.首先判断是否有这个服务 systemctl list-u ...

  7. 从EDR的火热看安全产品的发展

    从EDR的火热看安全产品的发展 2021年4月8日23:13 当开始写这篇博客时,外面正是护网进行得如火如荼的时候.作为一个产品经理,在吃瓜的同时,也在思考着安全产品的发展.这几年一些看得到的变化在深 ...

  8. 【java8新特性】01:函数式编程及Lambda入门

    我们首先需要先了解什么是函数式编程.函数式编程是一种结构化编程范式.类似于数学函数.它关注的重点在于数据操作.或者说它所提倡的思想是做什么,而不是如何去做. 自Jdk8中开始.它也支持函数式编程.函数 ...

  9. 基于深度学习的文本分类案例:使用LSTM进行情绪分类

    Sentiment classification using LSTM 在这个笔记本中,我们将使用LSTM架构在电影评论数据集上训练一个模型来预测评论的情绪.首先,让我们看看什么是LSTM? LSTM ...

  10. 手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)

    @ 目录 前言 一.OpenCV DNN模块 1.OpenCV DNN简介 2.LabVIEW中DNN模块函数 二.TensorFlow pb文件的生成和调用 1.TensorFlow2 Keras模 ...