工厂方法模式

问题:
1. 需要能够相对轻松地加入一些新的产品类型。
2. 每一个产品类型都可定制特定的功能。

概念:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。

实现:
1. 类图示例:

2. 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//产品抽象基类
abstract class ApptEncoder
{
    abstract public function encode();
}
//产品子类1
class BloggsApptEncoder extends ApptEncoder
{
    public function encode()
    {
        return "Appointment data encode in BloggsCal format\n";
    }
}
//产品子类2
class MegaApptEncoder extends ApptEncoder
{
    public function encode()
    {
        return "Appointment data encode in MegaCal format\n";
    }
}
 
//创建者抽象基类
abstract class CommsManager
{
    abstract public function getHeaderText();
    abstract public function getApptEncoder();
    abstract public function getFooterText();
}
//创建者子类1
class BloggsCommsManager extends CommsManager
{
    public function getHeaderText()
    {
        return "BloggsCal header\n";
    }
    public function getApptEncoder()
    {
        return new BloggsApptEncoder();
    }
    public function getFooterText()
    {
        return "BloggsCal footer\n";
    }
}
//创建者子类2
class MegaCommsManager extends CommsManager
{
    public function getHeaderText()
    {
        return "MegaCal header\n";
    }
    public function getApptEncoder()
    {
        return new MegaApptEncoder();
    }
    public function getFooterText()
    {
        return "MegaCal footer\n";
    }
}
 
//生成产品子类1对象
$manager1 = new BloggsCommsManager();
$encoder1 = $manager1->getApptEncoder();
echo $encoder1->encode();
//生成产品子类2对象
$manager2 = new MegaCommsManager();
$encoder2 = $manager2->getApptEncoder();
echo $encoder2->encode();

效果:
优点:
1. 实现了单一职责原则,创建者类的每一个子类都只需要负责实例化对应的产品子类。
2. 添加新的产品类型时,只需要添加一个新的产品子类,同时添加一个对应的创建者子类,无需修改原有类,只对扩展开放,不对修改开放,符合开放-封闭原则。
缺点:
1. 形成了一种特殊的代码重复,而且可能会导致不必要的子类化。
2. 客户端需要决定实例化哪个创建者子类。

 

posted @   疯一样的狼人  阅读(123)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2015-09-10 ThinkPHP缓存
2015-09-10 PHP操作Memcached
点击右上角即可分享
微信分享提示