php,java实现建造者模式_任鹏renpeng的博客-程序员秘密

技术标签: java  php,java实现设计模式  php  设计模式  

很容易将建造者模式和工厂方法模式混淆,他们的区别是工厂方法模式侧重生产出相同的对象实例,而建造者模式强调的是对同一个对象实例的生产,不同的生产工艺(方法的执行顺序和对属性的赋值)将产生不同效果的对象

类图
这里写图片描述

java实现

产品类

public class Product {

    public void setPart1(){

    }

    public void setPart2(){

    }
}

建造者抽象类

public abstract class AbsBuilder {

    public abstract Product getProduct();

    public abstract void setProductPart();

}

建造者实现类

public class Product1Builder extends AbsBuilder {
    

    private Product mProduct = new Product();

    @Override
    public Product getProduct() {
        return this.mProduct;
    }

    @Override
    public void setProductPart() {

        this.mProduct.setPart1();

        this.mProduct.setPart2();

    }
}
public class Product3Builder extends AbsBuilder {
    

    private Product mProduct = new Product();

    @Override
    public Product getProduct() {
        return this.mProduct;
    }

    @Override
    public void setProductPart() {
        this.mProduct.setPart2();
    }
}

场景类

public class Client {

    public Product getProduct1(){
        AbsBuilder builder = new Product1Builder();
        builder.setProductPart();
        return builder.getProduct();
    }

    public Product getProduct3(){
        AbsBuilder builder = new Product3Builder();
        builder.setProductPart();
        return builder.getProduct();
    }
}

php实现

class Product
{
    
    public function setPart1()
    {
    
        echo 'setPart1';
    }

    public function setPart2()
    {
    
        echo 'setPart2';
    }
}


abstract class AbsBuilder
{
    
    public abstract function getProduct();

    public abstract function setProductPart();
}


class Product1Builder extends AbsBuilder
{
    

    public $product;

    public function __construct()
    {
    
        $this->product = new Product;
    }
    public function getProduct()
    {
    
        return $this->product;
    }

    public function setProductPart()
    {
    
        $this->product->setPart1();
        $this->product->setPart2();

    }

}


class Product2Builder extends AbsBuilder
{
    

    public $product;

    public function __construct()
    {
    
        $this->product = new Product;
    }

    public function getProduct()
    {
    
        return $this->product;
    }

    public function setProductPart()
    {
    
        $this->product->setPart1();

    }

}


class Client
{
    
    public function getProduct1()
    {
    
        $builder = new Product1Builder;
        $builder->setProductPart();
        return $builder->getProduct();
    }
    public function getProduct3()
    {
    
        $builder = new Product2Builder;
        $builder->setProductPart();
        return $builder->getProduct();
    }

}

$client = new Client;
$client->getProduct1();
$client->getProduct3();
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/renpengddxx/article/details/64438307

智能推荐

android Binder设计与实现二_andorid binder实现包括哪些_SZ laoluo的博客-程序员秘密

4 Binder 协议Binder协议基本格式是(命令+数据),使用ioctl(fd, cmd, arg)函数实现交互。命令由参数cmd承载,数据由参数arg承载,随cmd不同而不同。下表列举了所有命令及其所对应的数据:表 2 Binder通信命令字命令 含义 argBINDER_WRITE_READ该命令向Bin

【PX4 飞控剖析】03 PX4固件烧录以及调试指南_px4飞控固件升级失败_-ATAO----的博客-程序员秘密

【PX4 飞控剖析】03 PX4固件烧录以及QGC初步指南一、加载固件二、加载参数三、校准传感器四、遥控器校准五、飞行模式六、电调校准七、检查参数一、加载固件打开电脑QGroundControl将飞控通过USB线连上电脑,右边会检测出飞控根据提示选择自定义固件。也就是加载电脑上的本地固件。固件也可以在PX4官网下载。点击确定后会弹出选择文件。根据路径选择打开,(固件都在桌面的固件文件夹内)直接点击确定下载,软件会为您下载最新固件(根据需要来选择)加载固件完成后会提示升级完成,等待音乐播放

【css】固定宽度文字换行_普通网友的博客-程序员秘密

今天群里有人问了个问题:在固定宽度的块级元素中,里面的内容最后一词组在宽度不够的情况下没有换行,如何让它换到下一行?这里我整理了下群里的方法,分享给大家。 首先给出问题,截图如下: html 代码: ...

Ulua_toLua_基本案例(六)_LuaCoroutine2_?Briella的博客-程序员秘密

Ulua_toLua_基本案例(六)_LuaCoroutine2using UnityEngine;using System.Collections;using LuaInterface;public class TestCoroutine2 : MonoBehaviour { LuaState luaState = null; string...

程序员从入门到放弃,书籍推荐_软件从入门到放弃_雪飞_海的博客-程序员秘密

大学主修嵌入式系统,学习过模电、数电、微机原理、FPGA、C/C++、Verlog、Linux等。毕业就开始,从事软件开发,中间接触操作系统:FreeRtos、VxWork、Linux、Unix语言: C/C++、Python、Qt、Shell、Lua数据库: MySql、SQL Server数据库经验总结:工作中,接触到的知识是有限,且片段的。需要有一个总结的过...

管理系统开发一: winform连接sql数据库_winform连接数据库_唯一不二的博客-程序员秘密

Winform连接SqlServel数据库进行居民管理系统开发。最近负责了一项居民管理系统,开始的我是懵的,因为除了大学学的那一点后,我之后就没怎么接触而且连大学学的那点也基本上还给老师了,但是开发还是要开发的,总不能跟钱过不去,不会可以学嘛。现在已经项目交接了,打算抽出点时间整理一下开发流程,算是给以后的自己回顾一下。正文:数据库的安装 和 登录推荐一个我当时看的sql serv...

随便推点

Bean Validation数据校验和分组校验_大力海棠的博客-程序员秘密

前端校验后,为什么需要后端校验在前面完成数据参数绑定到Controller时,我们可以在@RequestParam注解中做简单的空校验,就是设置required属性为true,以此来指定Controller方法中形参是否必须传入。数据校验是很常见的操作,有前端校验,即用户在前端页面上填写表单时,检查数据的合法性,再传入到后端。到了后端,还可以有后端的数据校验,后端校验通常是在业务逻辑方法,也就...

lvm配置_xiaoxiao树的博客-程序员秘密

一,配置raid二,  配置 lvm1,  /boot2. pv1        pg1              /             /home             /swap             /tmp3.  pv2            pg2           /data

什么是好的大学生活?_干了这一碗BUG的博客-程序员秘密

周保松认为,一所真正伟大的大学,不在于高楼,不在于大师,而在于学生,在于是否有能力培养出具独立精神和自由意识的知识人什么是好的大学生活?在相对主义成为绝对律令的年代,回答这个问题是困难的。但是,何兆武先生的《上学记》、齐邦媛先生的《巨流河》在读者之中口耳相传,又说明人们对于“好的大学生活”有着相似的期待。答案并不复杂,无非是在大学可以充分享有精神生活和公共生活:精神生活重在思想层面,重在个体独

关于满二叉树、完全二叉树以及完全二叉树的大根堆小根堆_大根堆二叉排序树_WSL-WLL的博客-程序员秘密

满二叉树 完全二叉树的定义满二叉树就是每一层节点个数都是满的二叉树。第n层节点个数 = pow(2,n - 1), 总的节点个数 = pow(2, n)。 完全二叉树就是满二叉树从最后一层的最右侧开始去节点得的树,这个去节点只能从右往左去。 满二叉树 完全二叉树关于完全二叉树的几个面试题目一:判断是不是完全二叉树思路:层次遍历:当前节点左子树不空放入queu...

JAVASE学习知识点_刘鑫磊up的博客-程序员秘密

链接:https://pan.baidu.com/s/1kWQcQ7YDjnJWn_YS3kJagg提取码:0fyr

Nginx配置及使用_cmd启动nginx_Hvitur的博客-程序员秘密

关闭cmd窗口后,不会停止,在后台还是运行状态,使用nginx.exe -s stop关闭nginx。2.在安装目录cmd,运行nginx.exe回车,当看到光标在闪烁,则nginx启动成功。对nginx.conf进行配置,Windos和Linux系统相同。因为多路复用的特点, 有可能出现两个同时运行的nginx。在前端代码中修改请求的端口号为nginx的监听端口号即可。重启时nginx.exe -s stop先关闭,再启动。修改nginx启动端口号,避免冲突。个人配置,仅供进行格式和位置参考。......