diff --git a/_posts/编程/设计模式/行为模式/Strategy.md b/_posts/编程/设计模式/行为模式/Strategy.md index 0659ffe..19365a2 100644 --- a/_posts/编程/设计模式/行为模式/Strategy.md +++ b/_posts/编程/设计模式/行为模式/Strategy.md @@ -18,7 +18,9 @@ tags: 设计模式 如果一开始代码都写在一起,每种消息通知方式不同整体数据结构也大相径庭,那么后期维护可想而知 💔 。。。 # 如何解决 + 将每种通知方式设为一种通知策略,因此在整体模块或服务设计时候,应该做好如下几点: + 1. 定义好策略统一入口 2. 定义好策略调度规则 3. 约定好策略算法接口 diff --git a/_posts/编程/设计模式/行为模式/factory-method.md b/_posts/编程/设计模式/行为模式/factory-method.md new file mode 100644 index 0000000..1a8e443 --- /dev/null +++ b/_posts/编程/设计模式/行为模式/factory-method.md @@ -0,0 +1,168 @@ +--- +title: 💫设计模式-工厂模式 +date: 2023-09-02 +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); + } +} + +```