[03]Go设计模式:工厂模式(Factory Pattern)

目录

  • 工厂模式

    • 一、简介
    • 二、代码
    • 三、参考资料

工厂模式

一、简介

工厂模式(Factory Pattern)是软件设计中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。在每增加一种类型时,只需要修改工厂函数即可。 在产品较多时,工厂函数代码逻辑将会非常复杂。

二、代码

package main

import "fmt"

type Animal interface {
    CanFly() bool
}

type Dog struct {
    Name string
    Age  int
}

func NewDog(name string, age int) *Dog {
    return &Dog{
        Name: name,
        Age:  age,
    }
}

func(d *Dog)CanFly() bool{
    fmt.Printf("%s can not fly\n", d.Name)
    return false
}

type Cat struct {
    Name string
    Age  int
}

func NewCat(name string, age int) *Cat {
    return &Cat{
        Name: name,
        Age:  age,
    }
}

func(c *Cat)CanFly() bool{
    fmt.Printf("%s can not fly\n", c.Name)
    return false
}

func Factory(name string, age int) Animal {
    if name == "Cat" {
        return NewCat(name, age)
    }else{
        return NewDog(name, age)
    }
}

func main(){
    d1 := Factory("Dog", 1)
    d1.CanFly()
    c1 := Factory("Cat", 1)
    c1.CanFly()
}

在写Factory遇到一个问题:

package main

import "fmt"

type Animal interface {
    CanFly() bool
}

type Cat struct {
    Name string
    Age  int
}

func NewCat(name string, age int) Cat {
    return Cat{
        Name: name,
        Age:  age,
    }
}

func(c *Cat)CanFly() bool{
    //修改只需要将c *Cat修改为c Cat即可
    fmt.Printf("%s can not fly\n", c.Name)
    return false
}

func Factory(name string, age int) Animal {
    if name == "Cat" {
        return NewCat(name, age) //这一行一直报错
    }
    return nil
}

method has pointer receiver, 通过参考资料2的链接解决了问题。一个struct虽然可以通过值类型和引用类型两种方式定义方法,但是不通的对象类型对应了不同的方法集:

Values Methods Receivers
T (t T)
*T (t T) and (t *T)

值类型的对象只有(t T) 结构的方法,虽然值类型的对象也可以调用(t *T) 方法,但这实际上是Golang编译器自动转化成了&t的形式来调用方法,并不是表明值类型的对象拥有该方法。

换一个维度来看上面的表格可能更加直观:

Values Methods Receivers
(t T) T and *T
(t *T) *T

这就意味着指针类型的receiver 方法实现接口时,只有指针类型的对象实现了该接口。

三、参考资料

1、 https://www.runoob.com/design-pattern/factory-pattern.html

2、 https://stackoverflow.com/questions/33936081/golang-method-with-pointer-receiver

原文地址:https://www.cnblogs.com/0pandas0/p/12040421.html

时间: 2024-10-24 08:43:41

[03]Go设计模式:工厂模式(Factory Pattern)的相关文章

23种设计模式--工厂模式-Factory Pattern

一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例就就依赖与这个类,2者之间的耦合度就高,此时我们就可以使用面向对象的去解决这个问题,将变化点封装起来,这就是我们将要首先引入的简单工厂模式:先来说一个场景,比如我们吃水果这个例子吧,我们有时候想吃苹果,有时候想吃橘子,但是每次都需要去买这些水果,后来有个水果店,又卖橘子,又卖苹果,这个水果店就当于简

设计模式-工厂模式[Factory]

先看下一个简单的实现: 1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author [email protected] 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Res

设计模式 - 出厂模式(factory pattern) 详细说明

出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式: 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 包括: 创建者父类(creator), 包括创建对象的方法(取代new详细的对象, 通过參数创建不同的对象), 和一些主要的方法; 详细创建者(concrete creator), 继承创建者父类,

Android设计模式之一个例子让你彻底明白工厂模式(Factory Pattern)

提出疑问 这几天研究工厂模式的时候,看到网上的一些文章中举的例子我就很疑惑,我相信这也是许多人的疑惑:工厂模式的功能就是创建实例,我们创建实例直接new不就完了吗,干嘛还得再封装一层工厂类,然后用工厂类再去new出这个实例?这不多此一举吗? 比如我看到这样的例子,我们的用户分为金牌用户和银牌用户,我们要创建一个金牌用户或者银牌用户. 定义一个用户接口 public interface ICustomer { String describe(); } 金牌用户实现类 public class Go

【设计模式】工厂模式 Factory Pattern

1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的实例. 角色: 工厂类:接收参数,返回参数指定的类的实例. 抽象产品:返回实例的类型,具体产品的基类. 具体产品:继承自抽象产品的类. 2)工厂方法模式 沿着上面的思路,创建的接口是稳定的,但是创建对象剧烈变化.将稳定的接口抽象成基类,让子类确定实例哪个产品,将实际创建工作推迟到子类中. 工厂方法用

创建型模式篇(工厂模式Factory Pattern)

一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着"某个对象"的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封装机制来隔离这个对象的变化,从而保持系统中其他依赖这个变化对象的对象,就要用到工厂模式. 2.目的:定义一个用户创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到它的子类. 3.结构图: 工厂模式:定义一个用于创建对象的接口,但是让子类决定实例化哪个

抽象工厂模式(abstarct factory pattern)和工厂模式(factory pattern)的比较

抽象工厂模式和工厂模式从字面上来看就有必然的联系,他们都是创建型模式.总结来说,工厂模式(factory pattern)只是个小工厂,只提供一层接口的实现类的输出,而抽象工厂模式(abstract factory pattern)是工厂模式的进一步升级,可以上升到两层以上的工厂模式继承,是工厂的工厂.一计算机来说,工厂模式可以是不同型号显示器,CPU或者网卡的提供者,而抽象工厂模式是显示器工厂.CPU工厂和网卡工厂的工厂.可以通过抽象工厂来获得CPU工厂,进而获得某个型号的CPU.整个依赖关系

工厂模式(factory pattern)

工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory).工厂方法(factory method).抽象工厂(abstract factory). 简单工厂包括3种组成元素:抽象产品.具体产品.具体工厂(简单工厂),结构图如下: C++实现: //抽象产品 class Car { public: virtual string getDescription() = 0; }; //具体产品 class Audi : public Car { string getDesc

设计模式(一)工厂模式Factory(创建类型)

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. 举例来说, 很多类型对象的创造须要一系列的步骤: 你可能须要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你须要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你怎样能轻松方