本段代码是我编写的案例 参照案例2

package main

import "fmt"

//面向对象接口练习

type JiSuan interface {
	Result() int
}

//工厂类
type Fact struct {
}

type Fulei struct {
	num1 int
	num2 int
}

type Add struct {
	Fulei
}

func (a *Add) Result() int {
	return a.num1+a.num2
}

//多态实现
func Result(o JiSuan){
	value := o.Result()
	fmt.Println(value)
}

//工厂实现
func (f *Fact) Result(num1 int, num2 int,ff string) {
	if ff == "+" {
		var a Add
		a.num1 = num1
		a.num2 = num2
		Result(&a)
	}

}

func main() {
	//工厂方法调取
	var f Fact
	f.Result(10,20,"+")

	//多态调取
	//a := Add{Fulei{10,20}}
	//Result(&a)

	//单独调取
	//a := Add{Fulei{10,20}}
	//res := a.Result()
	//fmt.Println(res)

	//使用接口
	//	var o JiSuan
	//	a := Add{Fulei{10,20}}
	//	o = &a
	//	res := o.Result()
	//	fmt.Println(res)
}

模块之间结构更紧凑 如果变成多文件 更模块化 使用更便捷
案例2

package main

import "fmt"

//定义接口
type Opter interface {
	//方法声明
	Result() int
}

//父类
type Operate struct {
	num1 int
	num2 int
}

//加法子类
type Add struct {
	Operate
}

//减法子类
type Sub struct {
	Operate
}

//乘法子类
type Mlt struct {
	Operate
}

//工厂类
type Factory struct {
}

//加法子类的方法
func (a *Add) Result() int {
	return a.num1 + a.num2
}

//减法子类的方法
func (s *Sub) Result() int {
	return s.num1 - s.num2
}

//乘法子类的方法
func (m *Mlt) Result() int {
	return m.num1 * m.num2
}

//多态实现
func Result(o Opter) {
	value := o.Result()
	fmt.Println(value)
}
func (f *Factory) Result(num1 int, num2 int, ch string) {
	switch ch {
	case "+":
		var a Add
		a.num1 = num1
		a.num2 = num2
		Result(&a)
	case "-":
		var s Sub
		s.num1 = num1
		s.num2 = num2
		Result(&s)
	case "*":
		var m Mlt
		m.num1 = num1
		m.num2 = num2
		Result(&m)
	}
}

//通过设计模式调用
func main() {
	//创建工厂对象
	var f Factory
	f.Result(10, 20, "*")
}

//多态调用
func main0203() {
	//var a Add = Add{Operate{10, 20}}
	var s Sub = Sub{Operate{10, 20}}
	Result(&s)
}

//接口调用
func main0202() {
	var o Opter
	var a Add = Add{Operate{10, 20}}

	o = &a
	value := o.Result()
	fmt.Println(value)

}

//方法调用
func main0201() {
	//创建加法对象
	//var a Add
	//a.num1 = 10
	//a.num2 = 20
	//v := a.Result()
	//fmt.Println(v)

	//创建减法对象
	var s Sub
	s.num1 = 10
	s.num2 = 20
	v := s.Result()
	fmt.Println(v)
}