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()
    }




  • 相关阅读:
    获取URL的name值 getUrl(url,name) 传入url和key 得到key对应的value
    封装GetQueryString()方法来获取URL的value值
    判断设备
    RecyclerView 加点击事件
    SparseArray,SparseBooleanArray和SparseIntArray
    内存泄漏监测-LeakCanary
    StrictMode
    数据结构-线性结构
    程序设计语言基础-知识点
    数据结构-概念
  • 原文地址:https://www.cnblogs.com/mcmx/p/11327212.html
Copyright © 2011-2022 走看看