Go---工厂模式,封装
工厂模式
Golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。
工厂模式来解决问题
使用工厂模式实现跨包创建结构体实例(变量)的案例:
1) 如果model 包的结构体变量首字母大写, 引入后,直接使用,没有问题.
main.go
package main
import (
"fmt"
"secondGo/factory/model"
)
func main(){
var stu = model.Student{
Name: " kegld",
Score : 69.6,
}
fmt.Println(stu)
}
student.go
package model
//定义一个结构体
type Student struct{
Name string
Score float64
}
2) 如果model包的结构体变量首字母小写,引入后,不能直接使用,可以工厂模式解决
student.go
package model
//定义一个结构体
type student struct{
Name string
Score float64
}
//因为student结构体首字母是小写,因此是只能在mode1使用
//我们通过工厂模式来解决
func NewStudent(n string,s float64) *student{
return &student{
Name : n ,
Score : s ,
}
}
main.go
package main
import (
"fmt"
"secondGo/factory/model"
)
func main(){
// var stu = model.Student{
// Name: " kegld",
// Score : 69.6,
// }
//定student结构体是首字母小写,我们可以通过工厂模式来解决
var stu = model.NewStudent("heyhey",66.6)
fmt.Println(stu)
}
访问首字母小写的字段 student.go
package model
//定义一个结构体
type student struct{
Name string
score float64
}
//因为student结构体首字母是小写,因此是只能在mode1使用
//我们通过工厂模式来解决
func NewStudent(n string,s float64) *student{
return &student{
Name : n ,
score : s ,
}
}
//如果score字段首字母小写,则,在其它包不可以直接方法,我们可以提供一个方法
func (s *student) GetScore() float64{
return s.score //ok
}
面问对象编程思想----抽象
如何理解抽象
我们在前面去定义一个结构体时候,实际上就是把一类事物的共有的属性和行为提取出来形成一个物理模型(模板)。这种研究问题的方法称为抽象。
面向对象编程三大特性
Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样。
封装
封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作。
封装的理解和好处
1) 隐藏实现细节
2) 可以对数据进行验证,保证安全合理
如何体现封装
1) 对结构体中的属性进行封装
2) 通过方法,包 实现封装
封装的实现步骤
1) 将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似private)
2) 给结构体所在包提供 一个工厂模式的函数,首字母大写。类似一个构造函数
3) 提供一个首字母大写的Set方法(类 似其它语言的public),用于对属性判断并赋值
func (var结构体类型名) Setxx(参数列表) (返回值列表) {
//加入数据验证的业务逻辑
var:字段=参数
}
4) 提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值
func (var结构体类型名) Gexxx() {
return var.字段
}
特别说明:在Golang开发中并没有特别强调封装,这点并不像Java.所以提醒学过java的朋友,不用总是用java的语法特性来看待Golang, Golang本身对面向对象的特性做了简化的。
for example
person.go
package model
import (
"fmt"
)
type person struct {
Name string
age int //首字母小写不能直接访问
sal float64
}
//写一个函数,
func NewPerson(name string) *person{
return &person{
Name : name,
}
}
func (p *person) SetAge(age int){
if age >0 && age <150{
p.age= age
}else{
fmt.Println("年龄范围不正确")
//设置一个默认值
}
}
func (p *person) GetAge() int {
return p.age
}
func (p *person) GetSal()float64{
return p.sal
}
func (p *person) SetSal(sal float64){
if sal >3000 && sal <1500000{
p.sal= sal
}else{
fmt.Println("薪水范围不正确")
//设置一个默认值
}
}
main.go
package main
import (
"fmt"
"secondGo/encanple/model"
)
func main(){
p := model.NewPerson("hihi")
p.SetAge(18)
p.SetSal(5000)
fmt.Println(p)
fmt.Println("姓名",p.Name,"年龄",p.GetAge(),"薪资",p.GetSal())
}
for example 封装实例
account.go
package model
import (
"fmt"
)
//定义一个结构体account
type account struct {
accountNum string
pwd string
balance float64
}
//工厂模式的函数----》构造函数
func NewAccount(accountNum string ,pwd string,balance float64) *account{
if len(accountNum) <6 || len(accountNum) > 10 {
fmt.Println("账号的长度不对。。。")
return nil
}
if len(pwd) != 6 {
fmt.Println("密码的长度不对。。。")
return nil
}
if balance < 0 {
fmt.Println("余额的资金不对。。。")
return nil
}
//返回一个 结构体account 类型
return &account{
accountNum : accountNum,
pwd : pwd,
balance : balance,
}
}
func (a *account) SetAccountNum(accountNum string){
a.accountNum = accountNum
}
func (a *account) GetAccountNum() string {
return a.accountNum
}
func (a *account) SetPwd(Pwd string){
a.pwd = Pwd
}
func (a *account) GetPwd() string {
return a.pwd
}
func (a *account) SetBalance(Balance float64){
a.balance = Balance
}
func (a *account) GetBalance() float64 {
return a.balance
}
main.go
package main
import (
"fmt"
"secondGo/count/model"
)
func main(){
//创建一个account
account := model.NewAccount("ok12345","893632",63)
if account != nil {
fmt.Println("创建成功=",account)
}else {
fmt.Println("创建失败")
}
account.SetAccountNum("666666")
fmt.Println(account.GetAccountNum())
fmt.Println(account.GetBalance())
fmt.Println(account.GetPwd())
}
Go---工厂模式,封装相关推荐
- Python工厂模式封装各类Webhook群聊机器人代码片段
引言 企业存在给 特定群组 自动推送消息的需求,比如:监控报警推送.销售线索推送.运营内容推送等. 你可以在群聊中添加一个自定义机器人,通过服务端调用 webhook 地址,即可将外部系统的通知消息即 ...
- php 工厂模式封装数据库,PHP设计模式之工厂模式
概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式. 好处: PHP中能够创建基于变量内容的类的新实例,减少主代码流中的 ...
- js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象
1.Factory基本写法 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 工厂模式和策略模式区别
先上代码: 定义一个抽象类 //抽象类 abstract class AbsClass {//抽象方法:提供一些列的算法操作public abstract void acceptCash(string ...
- linux车机系统怎么进工厂模式,工厂方法模式 - 跟JBPM学习设计模式_Linux编程_Linux公社-Linux系统门户网站...
模式简介 工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化那个类,其使一个类的实例化延迟到其子类中. 前边我们学习了简单工厂模式,简单工厂模式的最大优势在于工厂类中包含了必要逻辑判断,根据客 ...
- 一文带你看懂工厂模式
大家好我是mihotel,今天来总结一下设计模式中的工厂模式,在平时编程中,构建对象最常用的方式是 new 一个对象.乍一看这种做法没什么不好,而实际上这也属于一种硬编码.每 new 一个对象,相当于 ...
- 【设计模式】2.工厂模式
文章目录 1. 工厂模式概述 2. 简单工厂模式 3. 工厂方法模式 4. 抽象工厂模式 1. 工厂模式概述 工厂模式属于创建型模式的一种. 在java中,万物皆对象,这些对象都需要创建,如果创建的时 ...
- 工厂模式 五种写法总结
一概述: 属于创建型设计模式,需要生成的对象叫做产品 ,生成对象的地方叫做工厂 . 使用场景: 在任何需要生成复杂对象的地方,都可以使用工厂方法模式. 直接用new可以完成的不需要用工厂模式 个人理解 ...
- 工厂模式与策略模式之区别
设计模式有很多种,其中功能相似的很多,但是为什么还要分这么多种名字,查阅资料,我觉得下面的解释最为合理:用途不一样,名字就有区别,一把斧头用来砍人就叫凶器,用来砍柴就叫伐木斧,用来劈门就叫消防斧,这些 ...
- 设计模式(一) 工厂模式 五种写法总结
转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52798423 本文出自:[张旭童的博客] 系列开篇瞎BB 设计模式相关的文章学习与总结, ...
最新文章
- swift使用cocoapods导入oc三方库
- vscode安装本地服务器_VS Code安装和远程服务器连接配置
- Qt Creator指定动态属性
- 第10章 例题 7-4 汉诺(Hanoi)塔问题
- 单多晶之争:光伏技术要靠市场检验
- dbms中怎么跨数据源拷贝数据_Oracle中使用DBMS_XPLAN处理执行计划详解
- 使用LDAP查询快速提升域权限
- mysql2008完全卸载教程_完美卸载SQL Server 2008的方法
- [CS131] Lecture 1 Course Introduction
- stm32单片机按键消抖、长按、多击终极解决方案
- 华硕t100ha刷linux,华硕T100一键重装win7系统教程
- 数学建模常用算法—层次分析法(AHP)
- 快速搞懂Oracle 19c安全新特性 (二) Privilege Analysis(权限分析)
- matplotlib 设置坐标轴位置(spines),设置坐标别名(xticks,yticks)
- epub格式电子书剖析 .
- Windows搭建nexus3.xx
- fake news:使用区块链技术来保证新闻中数字媒体的真实性。
- 微服务架构-服务网关(Gateway)-服务网关在微服务中的应用
- 人类白细胞抗原-HLA简介
- skywalking数据链路追踪