• 工厂方法模式


    问题:
    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. 客户端需要决定实例化哪个创建者子类。

     

  • 相关阅读:
    整理—类型转换
    HTML简历
    数组
    选择语句2
    类型转换、运算符'
    C#(VS)基础
    hdu_1037(水题水疯了。。。史上最水)
    hdu_1033(我怎么找到的这么水的题,只为保存代码。。。)
    hdu_1030(数学题+找规律)
    hdu_1029_hash/map
  • 原文地址:https://www.cnblogs.com/wujuntian/p/9621353.html
Copyright © 2020-2023  润新知