Go实现常用软件设计模式二:工厂模式
目录:
- 举个栗子
- 概念介绍
- 使用场景
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实现常用软件设计模式二:工厂模式的更多相关文章
- 软件设计模式之工厂模式(JAVA)
什么是工厂模式? 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相 ...
- Java开发中常用的设计模式(一)---工厂模式
一. 准备工作 1. 本文参考自 自己理解的工厂模式,希望对大家有所帮助 二. 开始 以汽车工厂为例,首先有个汽车类的接口 Car,里面有个开车的方法 drive(),然后有个宝马车的类 BMW 和 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
- 5. 星际争霸之php设计模式--抽象工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 3. 星际争霸之php设计模式--简单工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- C#学习之设计模式:工厂模式
最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...
- Spring 实现两种设计模式:工厂模式和单态模式(单例模式)
本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
随机推荐
- KingbaseES 全局临时表
Postgresql 支持会话级别的临时表,表的存续期只在创建临时表的会话存活期间,会话退出后,临时表自动删除,表结构及数据也无法跨会话共享.KingbaseES 除了支持PG原生的临时表机制外,还支 ...
- Gitea v1.17.0 正式发布 | 集成软件包管理器、容器镜像仓库
我们自豪地宣布 Gitea v1.17.0 发布了.本次发布带来了诸多新特性和累积的更新,我们强烈建议用户在更新到最新版本之前仔细阅读发行注记. 在 1.17.0 版本的开发中我们一共合并了 645 ...
- Mysql 实现 向上递归查找父节点并返回树结构
需求:通过mysql 8.0以下版本实现,一个人多角色id,一个角色对应某个节点menu_id,根节点的父节点存储为NULL, 向上递归查找父节点并返回树结构. 如果只有叶子,剔除掉; 如果只有根,只 ...
- C#/VB.NET 在Word文档中插入分页符
分页符是分页的一种符号,上一页结束以及下一页开始的位置.通查用于在指定位置强制分页.本文将分为两部分来介绍如何在Word文档中插入分页符.并附上C#/VB.NET以供参考,详情请阅读以下内容. 在特定 ...
- [报错]-NameError: name 'NAN' is not defined
部分数据输出为NaN,处理这部分异常数据使用isnan()函数 from math import isnan isnan(z) 参考: https://www.cnblogs.com/itdyb/p/ ...
- Python数据科学手册-Numpy的结构化数组
结构化数组 和 记录数组 为复合的.异构的数据提供了非常有效的存储 (一般使用pandas 的 DataFrame来实现) 传入的dtpye 使用 Numpy数据类型 Character Descri ...
- JAVA SE 基础总结
§ 基础知识 一.程序组织与运行原理 1.1 程序组织 一个 JAVA 程序文件中主要由如下几部分构成: package 声明 public 类:public 类与类文件名相同,因为其是作为该类文件唯 ...
- CentOS 7.7系统安装Redis 6.0.3
前提操作 避免出现如下的错误 yum -y install gcc tcl yum -y install centos-release-scl yum -y install devtoolset-9- ...
- frps服务端与nginx可共用443端口
转载自: https://www.ioiox.com/archives/78.html frps服务器上的nginx frps.ini配置 由于nginx占用80/443端口,frps.ini中的 v ...
- 洛谷P2367 语文成绩(差分)
标准的差分应用题,不要想的太复杂,写成了线段树. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e6+10 ...