案例分析:设计模式与代码的结构特性

时间:2019-12-07 15:32:31   收藏:0   阅读:76

简单工厂模式,通过工厂类提供的方法,传入参数,工厂方法根据参数判断要创建什么样的对象返回

 技术分享图片

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。创建一个工厂接口,具体实现是由其实现类实现。

技术分享图片

抽象工厂模式:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类

 技术分享图片

引用关键代码,解释该设计模式在该应用场景中的适用性:

工厂模式:

#创建一个区块工厂类
class BlockFactory():
    def newBlock(self,data,prevBlockHash):
        #生成一个默认区块对象
        block = Block(time.time(),data,prevBlockHash,"")
        #获取并设置该区块hash
        block.setHash()
        return block
#创建一个创世区块工厂类
class GenesisBlockFactory():
    #新生成一个创世区块
    def mineNewBlock(self,data,prevBlockHash):
        block = self.newBlock(data,prevBlockHash)
        #开始挖矿,要求前n位数值为零,以此作为工作量证明
        nonce,hashedData = work.runNewProofOfWork(block)
        block.hash = hashedData
        block.nonce = nonce
        return block
    #将创世区块加入到区块链中
    def addBlock(self,data,lasthash,mine=False):
        for tx in data:
            if not self.verifyTransaction(tx):
                print("ERROR: Invalid transaction")
        #如果不挖区块
        if mine == False:
            newBlock = factory.newBlock(data,lasthash)
            self.blocks+=[newBlock]
        else:
            newBlock = factory.mineNewBlock(data,lasthash)
            self.blocks+=[newBlock]
    #新挖一个创世区块
    def newGenesisBlock(self,data,mine=False):
        for tx in data:
            #矿工验证交易正确性
            if not self.verifyTransaction(tx):
                print("ERROR: Invalid transaction")
        if mine == False:
            newBlock = factory.newBlock(data,"")
            self.blocks+=[newBlock]
        else:
            newBlock = factory.mineNewBlock(data,"")
            self.blocks+=[newBlock]
#生成区块
block = BlockFactory().newBlock(...)
#生成创世区块
GenesisBlock = GenesisBlockFactory().newBlock(...)

 

抽象工厂:

#工厂方法虽然解决了我们“修改代码”的问题,但如果我们要生产很多产品,就会发现我们同样需要写很多对应的工厂类。比如如果Factory不仅生产block,还要生产GenesisBlock等,这样需要建造多个生产类。所以为了解决这个问题,我们就要再更进一步的抽象工厂类,让一个工厂可以生产同一类的多个产品,这就是抽象工厂。
class AbstractFactory(object):
    @abc.abstractmethod
    def productBlock(self):
        pass

    @abc.abstractmethod
    def productGenesisBlock(self):
        pass    
class Factory(AbstractFactory):
    def productBlock(self):
        return Block(time.time(),data,prevBlockHash,"")
    def productGenesisBlock(self):
         block = self.newBlock(data,prevBlockHash)
        nonce,hashedData = work.runNewProofOfWork(block)
        block.hash = hashedData
        block.nonce = nonce       
        return block  
b1 = Factory().productBlock()
b2 = Factory().productGenesisBlock()
#抽象工厂模式与工厂方法模式最大的区别在于,抽象工厂中的一个工厂对象可以负责多个不同产品对象的创建 ,这样比工厂方法模式更为简单、有效率。

 

引入该设计模式后对系统架构和代码结构带来了哪些好处:

解释其中用到的多态机制

说明模块抽象封装的方法

 #新加入一个区块,对于需要创建不同区块的工厂,复用这个抽象封装函数,实现自己的创建过程
 @abc.abstractmethod
 def productBlock(self):
     pass
 #新生成一个创世区块,对于需要生成不同创世区块的工厂,复用这个抽象封装函数,实现自己的创建创世区块过程
 @abc.abstractmethod
 def productGenesisBlock(self):
     pass   

分析各个模块的内聚度和模块之间的耦合度

提供该应用范例完整的源代码包括构建部署的操作过程

完整源代码:

https://github.com/yummybian/blockchain-py

部署过程:

https://bigishdata.com/2017/10/17/write-your-own-blockchain-part-1-creating-storing-syncing-displaying-mining-and-proving-work/

参考:

https://liuchengxu.gitbook.io/blockchain/bitcoin/basic-prototype

原文:https://www.cnblogs.com/muddyway/p/12001503.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!