diff --git a/_posts/编程/设计模式/行为模式/factory-method.md b/_posts/编程/设计模式/行为模式/factory-method.md new file mode 100644 index 0000000..4e48010 --- /dev/null +++ b/_posts/编程/设计模式/行为模式/factory-method.md @@ -0,0 +1,168 @@ +--- +title: 💫设计模式-工厂模式 +date: 2023-09-05 +tags: 设计模式 +--- + +**工厂模式**是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。 + +# 需求的场景 +这种模式在面试中经常会被问到,很多面试题的答案会表示该模式经常用于框架的db或cache组件设计。 + +假设你所在项目组在开发某个项目中,使用了多种缓存数据源,比如有内存,redis,本地文件。目前每次根据不同场景使用不同类型缓存,需要实例化不同缓存实例进行操作,比较繁琐。项目组开发人员希望统一调用缓存入口,简化缓存调用心智负担。 + + +# 如何解决 +1. 定义cache工厂类(父类)和依赖类 +2. 编写各个类型cache子类 +3. cache工厂类创建调用 + +# 实现 + +1. 😼定义cache工厂类(父类)和依赖类 + +```php +class Config +{ + private string $host; //连接host + + private string $dbName;// 数据库名称 + + private string $password;// 密码 + + private string $userName;// 用户名 + + public function getHost(): string + { + return $this->host; + } + + public function setHost(string $host): static + { + $this->host = $host; + return $this; + } + + public function getDbName(): string + { + return $this->dbName; + } + + public function setDbName(string $dbName): static + { + $this->dbName = $dbName; + return $this; + } + + public function getPassword(): string + { + return $this->password; + } + + public function setPassword(string $password): static + { + $this->password = $password; + return $this; + } + + public function getUserName(): string + { + return $this->userName; + } + + public function setUserName(string $userName): static + { + $this->userName = $userName; + return $this; + } +} + +``` + +2. 😸编写各个类型cache子类 +```php +class Cache +{ + protected Config $config; + + public function __construct(Config $config) + { + $this->config = $config; + } + + public static create(string $cache) + { + return new $cache($this->config); + } + + +} + + +class Redis extends Cache +{ + + public function __construct(Config $config) + { + parent::__construct(Config $config); + + $this->connect() + } + + protected function connect() + { + //根据Config进行缓存连接 + } +} + + +class Memory extends Cache +{ + + public function __construct(Config $config) + { + + parent::__construct(Config $config); + + } + + +} + +class File extends Cache +{ + + private string $cachePath = '/dev/logs/' + + public function __construct(Config $config) + { + parent::__construct(Config $config); + + + } + + +} + +``` + +3. 😺cache工厂类创建调用 + +```php +class Demo +{ + public function run() + { + $config = (new Config())->setHost('localhost') + ->setUserName('demo') + ->setPassword('*****'); + + $cache = new Cache($config); + //创建redis cache实例 + $redis = $cache->create(Redis::class); + //创建本地file cache实例 + $file = $cache->create(File::class); + } +} + +```