目录
PHP设计模式(二),php设计模式
简单工厂模式
工厂模式
首页 后端开发 php教程 PHP设计模式(二),php设计模式_PHP教程

PHP设计模式(二),php设计模式_PHP教程

Jul 13, 2016 am 10:12 AM
设计模式

PHP设计模式(二),php设计模式

  从最近开始我给自己定了个目标,每周至少更新2篇博客,用来记录自己在上一周里面遇到的问题或者想出的新点子,一方面对自己掌握的知识进行记录,免得时间久了忘得一干二净,二来我的博文虽然不怎么好但也许会对一小部分读者产生一定的影响,而且我相信随着我原创博文写的次数越来越多,肯定水平会越来越高,深度也会越来越深(哈哈,我也很羡慕那些出名的博主,不但专业知识很棒,而且文笔也棒的很)。一周两篇我发现完全记录不完我想记录的东西,就像这周,我还有日志系统、二进制数据缓存(其实叫low一点的数据库比较合适)、QQwry.dat数据解读、zip压缩文件增量生成这几个方面的都没有进写,在以后的时间里我会慢慢更新到我的博客的,好了不扯了,这次我来介绍另外一种模式。

  • 简单工厂模式

  其实这种模式也是比较常用的,应该首先介绍,但由于我接触的单例模式比较多,所以就先介绍单例模式了。简单工厂模式,首先看下对它的定义:从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

  简单工厂模式在项目中有什么好处呢?他有两个好处:

1. 首先就是使用简单工厂模式可以根据不同的参数去实例化不同的类,而不是new方法去实例化每一个不同的类,这样给使用者这样更好管理。

2. 其次就是如果要实例化的类在多个文件中用到,当我们修改类名称的时候只需要去修改工厂类就行,而不必修改每一个实例化该类的文件(有点鸡肋的感觉,这种情况很少见)。

  看一个最经典也最好理解的一个简单工厂模式的例子,运算符操作:

  简单工厂模式的工厂类一般是使用静态方法,通过接受不同的参数来返回不同的对象实例,代码是写死的,因此不修改代码就不能进行扩展,违反了OCP(对扩展开发,对修改关闭原则)。

<?<span>php
</span><span>/*</span><span>*
 * 简单工厂模式&mdash;&mdash;经典运算符例子
 * @author 燕睿涛(luluyrt@163.com)
 </span><span>*/</span>
<span>/*简单</span><span>工********************厂********************类</span><span>*/</span>
<span>class</span><span> Operation{
    </span><span>/*</span><span>*
     * @var int $numa
     * 要操作的两个数字
     </span><span>*/</span>
    <span>protected</span> <span>$numa</span><span>;
    </span><span>protected</span> <span>$numb</span><span>;
    </span><span>public</span> <span>function</span> __construct(<span>$a</span>,<span>$b</span><span>){
        </span><span>$this</span>->numa = <span>$a</span><span>;
        </span><span>$this</span>->numb = <span>$b</span><span>;
    }

    </span><span>//</span><span>静态方法,通过接受不同的参数生成不同的对象实例</span>
    <span>public</span> <span>static</span> <span>function</span> create(<span>$operation</span>,<span>$a</span>,<span>$b</span><span>){
        </span><span>switch</span> (<span>$operation</span><span>) {
            </span><span>case</span> '+':
                <span>return</span> <span>new</span> Operationadd(<span>$a</span>,<span>$b</span><span>);
                </span><span>break</span><span>;
            
            </span><span>case</span> '-':
                <span>return</span> <span>new</span> Operationminus(<span>$a</span>,<span>$b</span><span>);
                </span><span>break</span><span>;
            </span><span>default</span>:
                <span>#</span><span> code...</span>
                <span>break</span><span>;
        }
    }

}
</span><span>/*</span><span>**********************************************</span><span>*/</span>

<span>/*</span><span>加法</span><span>*/</span>
<span>class</span> Operationadd <span>extends</span><span> Operation{
    </span><span>public</span> <span>function</span><span> doing(){
        </span><span>return</span> <span>$this</span>->numa + <span>$this</span>-><span>numb;
    }
}

</span><span>/*</span><span>减法</span><span>*/</span>
<span>class</span> Operationminus <span>extends</span><span> Operation{
    </span><span>public</span> <span>function</span><span> doing(){
        </span><span>return</span> <span>$this</span>->numa - <span>$this</span>-><span>numb;
    }
}

</span><span>$test</span> = Operation::create('+',2,56<span>);
</span><span>echo</span> <span>$test</span>->doing();
登录后复制
  • 工厂模式

  之前我在项目中只接触到了简单工厂模式,为了写这篇文章我特意查了资料,发现工厂模式有三种:简单工厂模式(又叫静态工厂模式)、工厂模式、抽象工厂模式,看了工厂模式之后感觉他的用处好像不是很大,只是符合了OCP原则,在有新的符合抽象产品接口和抽象工厂接口的产品时我们只需要去扩展一种具体的产品和工厂就行,而不必去修改原有代码,总结下工厂模式的优缺点:

优点:首先就是符合了OCP原则,扩展性提高了;其次就是可维护性提高了,在修改一个具体工厂角色时只要找到自己的工厂角色就行,不用担心影响到其他工厂角色的实现。

缺点:代码多了,每种产品都要一个产品类和一个工厂类。这个缺点可以用简单工厂模式和工厂模式的结合来实现,将类似的产品类的工厂类合并为一个。

<?<span>php
</span><span>/*</span><span>*
 * 简单工厂模式&mdash;&mdash;经典运算符例子
 * @author 燕睿涛(luluyrt@163.com)
 </span><span>*/</span>
<span>/*</span><span>工*********厂**********方**********法</span><span>*/</span>
<span>//</span><span>交通工具接口(抽象产品角色)</span>
<span>interface</span><span> vehicle{
    </span><span>public</span> <span>function</span><span> runing();
}
</span><span>//</span><span>交通工具工厂接口(抽象工厂角色)</span>
<span>interface</span><span> vehiclefactory{
    </span><span>public</span> <span>static</span> <span>function</span><span> get();
}
</span><span>/*</span><span>具体产品角色</span><span>*/</span>
<span>class</span> car <span>implements</span><span> vehicle{
    </span><span>public</span> <span>function</span><span> runing(){
        </span><span>echo</span> "My speed is 120KM/h \r"<span>;
    }
}

</span><span>class</span> bicycle <span>implements</span><span> vehicle{
    </span><span>public</span> <span>function</span><span> runing(){
        </span><span>echo</span> "My speed is 30KM/h \r"<span>;
    }
}
</span><span>/*</span><span>具体工厂角色</span><span>*/</span>
<span>class</span> carfactory <span>implements</span><span> vehiclefactory{
    </span><span>public</span> <span>static</span> <span>function</span><span> get(){
        </span><span>return</span> <span>new</span><span> car();
    }
}
</span><span>class</span> bicyclefactory <span>implements</span><span> vehiclefactory{
    </span><span>public</span> <span>static</span> <span>function</span><span> get(){
        </span><span>return</span> <span>new</span><span> bicycle();
    }
}

</span><span>$test</span> = bicyclefactory::<span>get();
</span><span>$test</span>->runing();
登录后复制

工厂类自己没在具体项目中用过,说起来总感觉有点怪怪的感觉,要是有什么不对的、不恰当的地方,还望各位高手前辈们指出。

send Me~

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/920433.htmlTechArticlePHP设计模式(二),php设计模式 从最近开始我给自己定了个目标,每周至少更新2篇博客,用来记录自己在上一周里面遇到的问题或者想出的新...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Java框架中设计模式与架构模式的区别 Java框架中设计模式与架构模式的区别 Jun 02, 2024 pm 12:59 PM

在Java框架中,设计模式和架构模式的区别在于:设计模式定义了在软件设计中解决常见问题的抽象解决方案,关注类和对象之间的交互,如工厂模式。架构模式定义了系统结构和模块之间的关系,关注系统组件的组织和交互,如分层架构。

Java设计模式之装饰器模式剖析 Java设计模式之装饰器模式剖析 May 09, 2024 pm 03:12 PM

装饰器模式是一种结构型设计模式,允许动态添加对象功能,无需修改原始类。它通过抽象组件、具体组件、抽象装饰器和具体装饰器的协作实现,可以灵活扩展类功能,满足变化的需求。示例中,将牛奶和摩卡装饰器添加到Espresso,总价为2.29美元,展示了装饰器模式在动态修改对象行为方面的强大功能。

PHP 设计模式实战案例解析 PHP 设计模式实战案例解析 May 08, 2024 am 08:09 AM

1.工厂模式:分离对象创建和业务逻辑,通过工厂类创建指定类型的对象。2.观察者模式:允许主题对象通知观察者对象其状态更改,实现松耦合和观察者模式。

设计模式如何应对代码维护难题 设计模式如何应对代码维护难题 May 09, 2024 pm 12:45 PM

设计模式通过提供可重用和可扩展的解决方案来解决代码维护难题:观察者模式:允许对象订阅事件,并在事件发生时收到通知。工厂模式:提供了一种创建对象的集中式方式,而无需依赖具体类。单例模式:确保一个类只有一个实例,用于创建全局可访问的对象。

Java设计模式之适配器模式的妙用 Java设计模式之适配器模式的妙用 May 09, 2024 pm 12:54 PM

适配器模式是一种结构型设计模式,允许不兼容对象协同工作,它将一个接口转换为另一个,使对象能够顺利交互。对象适配器通过创建包含被适配对象的适配器对象,并实现目标接口,实现适配器模式。在一个实战案例中,通过适配器模式,客户端(如MediaPlayer)可以播放高级格式的媒体(如VLC),尽管其本身仅支持普通媒体格式(如MP3)。

PHP设计模式:测试驱动开发实践 PHP设计模式:测试驱动开发实践 Jun 03, 2024 pm 02:14 PM

TDD用于编写高质量PHP代码,步骤包括:编写测试用例,描述预期功能并使其失败。编写代码,仅使测试用例通过,无需过分优化或详细设计。测试用例通过后,优化和重构代码以提高可读性、可维护性和可扩展性。

Guice框架中设计模式的应用 Guice框架中设计模式的应用 Jun 02, 2024 pm 10:49 PM

Guice框架应用了多项设计模式,包括:单例模式:通过@Singleton注解确保类只有一个实例。工厂方法模式:通过@Provides注解创建工厂方法,在依赖注入时获取对象实例。策略模式:将算法封装成不同策略类,通过@Named注解指定具体策略。

java框架中使用设计模式的优缺点有哪些? java框架中使用设计模式的优缺点有哪些? Jun 01, 2024 pm 02:13 PM

Java框架中使用设计模式的优点包括:代码可读性、可维护性和可扩展性增强。缺点包括:过度使用导致复杂性、性能开销以及学习曲线陡峭。实战案例:代理模式用于延迟加载对象。明智地使用设计模式可充分利用其优势并最小化缺点。

See all articles