zoukankan      html  css  js  c++  java
  • 工厂方法模式

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

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

    实现:
    1. 类图示例:

    2. 代码示例:

    //产品抽象基类
    abstract class ApptEncoder
    {
    	abstract public function encode();
    }
    //产品子类1
    class BloggsApptEncoder extends ApptEncoder
    {
    	public function encode()
    	{
    		return "Appointment data encode in BloggsCal format
    ";
    	}
    }
    //产品子类2
    class MegaApptEncoder extends ApptEncoder
    {
    	public function encode()
    	{
    		return "Appointment data encode in MegaCal format
    ";
    	}
    }
    
    //创建者抽象基类
    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
    ";
    	}
    	public function getApptEncoder()
    	{
    		return new BloggsApptEncoder();
    	}
    	public function getFooterText()
    	{
    		return "BloggsCal footer
    ";
    	}
    }
    //创建者子类2
    class MegaCommsManager extends CommsManager
    {
    	public function getHeaderText()
    	{
    		return "MegaCal header
    ";
    	}
    	public function getApptEncoder()
    	{
    		return new MegaApptEncoder();
    	}
    	public function getFooterText()
    	{
    		return "MegaCal footer
    ";
    	}
    }
    
    //生成产品子类1对象
    $manager1 = new BloggsCommsManager();
    $encoder1 = $manager1->getApptEncoder();
    echo $encoder1->encode();
    //生成产品子类2对象
    $manager2 = new MegaCommsManager();
    $encoder2 = $manager2->getApptEncoder();
    echo $encoder2->encode();
    

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

     

  • 相关阅读:
    密码朋克的社会实验(一):开灯看暗网
    ThinkPHP5框架缺陷导致远程命令执行(POC整合帖)
    SQL基本注入演示
    从SQL注入到内网漫游
    业务逻辑漏洞探索之敏感信息泄露
    Web安全之XSS Platform搭建及使用实践
    iOS URL Schemes与漏洞的碰撞组合
    phpcms2008远程代码执行漏洞
    使用RSA加密在Python中逆向shell
    源码级调试的XNU内核
  • 原文地址:https://www.cnblogs.com/wujuntian/p/9621353.html
Copyright © 2011-2022 走看看