最近在看智能合约的工厂模式,工厂模式明白,但部署后的合约总是工厂中的方法,久久不明白是怎么回事,今天在学习课程时终于解决了这个问题。
首先来看一个工厂模式的例子,最近总是去做核酸,因此写一个防疫站点工厂吧。
1、一个防疫站点合约,里面记录站点信息与方法
2、一个防疫站点工厂合约,用于创建防疫站点或注销防疫站点方法(例子中暂时只有创建没有注销)
以下只是简单示例,没有过多校验与逻辑:?
备注:编写、编译、部署合约都是在Remix中完成。
// SPDX-License-Identifier:MIT
pragma solidity ^0.8.7;
//站点
contract Station {
//站点名称
string private name;
//站点位置
string addr;
//站点人员数量
uint16 count;
//构造函数
constructor(string memory _name, string memory _addr, uint16 _count) {
name = _name;
addr = _addr;
count = _count;
}
function getStationInfo() public view returns (string memory, string memory, uint16) {
return (name, addr, count);
}
}
//站点工厂
contract StationFactory {
//状态变量 - 存储所有已创建的站点
address[] stations;
// 创建站点工厂
function createStation(string memory _name, string memory _addr, uint16 _count) external {
Station station = new Station(_name, _addr, _count);
stations.push(address(station));
}
//获取所有站点工厂
function getStationAll() external view returns (address[] memory) {
return stations;
}
}
部署合约 - 选择StationFactory合约部署:
部署完成后,调用方法“createStation”增加一个防疫站点,然后调用方法“getStationAll”查看新增防疫站点的合约地址:
拷贝新增防疫站点的合约地址到At Address中查看合约:
我的问题来了,查看新合约地址内容,发现还是工厂中的方法,而没有出现防疫站点中的方法,久久思考这是为什么,一直没想明白,后来在老师的教程中发现需要选择防疫站点合约(因为默认是工厂合约,所以一直显示工厂合约中的方法)。
选择合约“Station”, 再点击“At Address”,终于出来梦寐已久的防疫站点合约了,查看下在工厂合约中增加的防疫站点,没错,就是它了。
当然我们可以通过工厂合约添加更多的防疫站点,每个防疫站点都有自己的合约地址,可以通过合约地址进行维护自己的防疫站点(当然也需要在防疫站点中增加一些方法进行维护,比较检测时间,检测结果等等)。?
完结。
|