zoukankan      html  css  js  c++  java
  • 创建型设计模式——工厂模式

    简单工厂模式:。

    ../_images/SimpleFactory.jpg


      简单的,只有一个工厂类,通过向工厂对象种传参来使工厂判断创建哪个类的对象,
      通常通过if、switch语句来实现,由很大的缺点,如果我们再加入要创建的新的类
      就必须要更改工厂的源代码才可以使得工厂支持创建这个新的类的对象。
      shi'yong
    package main
    import "fmt"

    type Product interface {
    print()
    set(num int)
    }


    type Product1 struct {
    num int
    }
    func (it *Product1)print(){
    fmt.Println(it.num)
    }
    func (it *Product1)set(num int){
    it.num = num
    fmt.Println(it.num)
    }


    type Product2 struct{
    num int
    }
    func (it *Product2)print(){
    fmt.Println(it.num)
    }
    func (it *Product2)set(num int){
    it.num = num
    fmt.Println(it.num)
    }



    type Factory struct {

    }
    func (it *Factory)createFactory(str string) (product Product){
    switch str {
    case "Product1":
    product = new(Product1)
    case "Product2":
    product = new(Product2)
    default:

    }
    return
    }



    func main(){
    factory := new(Factory)
    p1 := factory.createFactory("Product1")
    p2 := factory.createFactory("Product2")
    p1.set(1)
    p2.set(2)
    p1.print()
    p2.print()

    }

    工厂方法模式:
    ../_images/FactoryMethod.jpg

       首先说明,我们所有的要实现通过此工厂模式来创建兑现的类。都需要有一个对应的工厂类。呈现一一对应关系。且所有的类对应的工厂类都实现了
    一个抽象的工厂类,也就是一个工厂模型,其它的工厂都是这个工厂的拷贝,在这个工厂的基础上加工加工,(多态)
    比如说我有一个Product1和Product2都要在这个工厂模式中创建对象。有一个接口Factory,两个类对应的工厂类实现了它,Product1Factory
    和Product2Factory,通过这两个工厂中的方法(自己写的)来返回一个实例对象。
        package main

    import "fmt"

    type Product interface {
    print()
    set(num int)
    }


    type Product1 struct {
    num int
    }
    func (it *Product1)print(){
    fmt.Println(it.num)
    }
    func (it *Product1)set(num int){
    it.num = num
    fmt.Println(it.num)
    }


    type Product2 struct{
    num int
    }
    func (it *Product2)print(){
    fmt.Println(it.num)
    }
    func (it *Product2)set(num int){
    it.num = num
    fmt.Println(it.num)
    }




    type factory interface {
    createProduct()
    }


    type Product1Factory struct {
    }
    func(it *Product1Factory)createFactory()(product Product){
    product = new(Product1)
    return
    }


    type Product2Factory struct {
    }
    func(it *Product2Factory)createFactory()(product Product){
    product = new(Product2)
    return
    }

    func main(){
    p1 := (new(Product1Factory).createFactory())
    p2 := (new(Product2Factory).createFactory())
    p1.set(1)
    p2.set(2)
    p1.print()
    p2.print()

    }

    抽象工厂模式:
    ../_images/AbatractFactory.jpg

      怎么说呢,这个工厂模式,实际上是为了在一个工厂内创建多个类型的实例,比如说我们有A,A1,A2
    B,B1,B2 .A,B是两个厂家,但是A1,B1是同一类商品。我们要仅仅创建一个厂家的商品。这时候就需要将不同类型的商品的创建方法放在同一个工厂中
    打个最实在的比喻,小米的工厂生产小米的手机和电脑,华为的也是。他们要分开生产自个儿的,对吧。就是这,重点是将一种产品的多个不同实例分开创建
    package main

    import (
    "fmt"
    )


    type product1 interface {
    print()
    set (num int)
    }

    type product1A struct {
    num int
    }
    func(it *product1A)print(){
    fmt.Println(it.num)
    }
    func(it *product1A)set(num int){
    it.num = num
    }

    type product1B struct {
    num int
    }
    func(it *product1B)print(){
    fmt.Println(it.num)
    }
    func(it *product1B)set(num int){
    it.num = num
    }



    type product2 interface {
    print()
    set(num int)
    }

    type product2A struct {
    num int
    }
    func(it *product2A)print(){
    fmt.Println(it.num)
    }
    func(it *product2A)set(num int){
    it.num = num
    fmt.Println(it.num)
    }

    type product2B struct {
    num int
    }
    func(it *product2B)print(){
    fmt.Println(it.num)
    }
    func(it *product2B)set(num int){
    it.num = num
    fmt.Println(it.num)
    }



    type factory interface {
    createProduct1() product1
    createPRoduct2() product2
    }

    type AFactory struct {
    }
    func(it *AFactory)createProduct1() product1{
    return new(product1A)
    }
    func(it *AFactory)createProduct2()product2{
    return new(product2A)
    }

    type BFactory struct {}
    func(it *BFactory)createProduct1() product1{
    return new(product1B)
    }
    func(it *BFactory)createProduct2() product2{
    return new(product2B)
    }

    func main(){
    AP1 := new(AFactory).createProduct1()
    AP2 := new(AFactory).createProduct2()
    BP1 := new(BFactory).createProduct1()
    BP2 := new(BFactory).createProduct2()
    AP1.set(1)
    AP2.set(2)
    BP1.set(3)
    BP2.set(4)
    AP1.print()
    AP2.print()
    BP1.print()
    BP2.print()
    }




  • 相关阅读:
    前端开发和网页设计的过去和未来
    Web开发人员vs网页设计师
    Linux最终将会领先于Windows、Mac OS!
    Linux 大爆炸:一个内核,无数发行版
    因PHP漏洞,超过4.5万个中国网站被攻击
    在 Linux 中自动配置 IPv6 地址
    echart-折线图,数据太多想变成鼠标拖动和滚动的效果?以及数据的默认圈圈如何自定义圆圈的样式
    用TweenMax.js动画让数字动起来
    zrender笔记----(数字Number组件)出现的问题和解决办法
    面试题常考&必考之--js中的数组去重和字符串去重
  • 原文地址:https://www.cnblogs.com/mcmx/p/11327212.html
Copyright © 2011-2022 走看看