8.建造者模式

1.说明
请参阅本系列第一章节
2.建造者模式说明
构造者模式:将一个复杂的构建与它的表示分离,使得同样的构建过程,可以创建不同的表示。即生成具有不同内部表象的产品对象。在使用的时候,用户只需要知道构建的对象就行了,而不需要知道构建的细节。客户端通过调用指挥者的接口,来控制构建过程,使得能够隔离用户的构建过程
注意事项:指挥者的构建过程必须足够普遍,以此来构建不同的具体的对象。如果这些构建的对象的有相同的属性或行为,也可以在指挥者中构建公共的方法
好处:建造的代码与表示代码分离,耦合度更低,构建者隐藏了产品的组装,使得表示代码更关注实现,如需修改,只需要修改实现细节,不用修改创建流程
感觉和工厂模式,模板方法模式都比较类似:都是需要注意的是:
工厂是生产不同对象,而建造者模式是构建具有不同内部表示的对象,注重细节
如果仅仅是构建对象内部的部分参数不同,可以通过传入参数的方式来构建,而不是用派生的方式来添加
3.UML
这里写图片描述
4.代码
代码背景:不同品牌的电脑,组装流程是一样的,代码简单较少了电脑的组装过程

 //建造者模式基类:BuildComBase.h
 #ifndef __BUILDCOMBASE_H
#define __BUILDCOMBASE_H

#include <iostream>

class CBuildComBase
{
public:
    virtual void create_cpu() = 0;
    virtual void create_mem() = 0;
    virtual void create_mainboard() = 0;
    virtual void create_harddisk() = 0;
    virtual void create_others()
    {
        std::cout<<"windows system"<<std::endl;
        std::cout<<"mouth"<<std::endl;
        std::cout<<"power"<<std::endl;
    }
};

#endif

//thinkpad 创建流程 ThinkPad.h
 #ifndef __THINKPAD_H
#define __THINKPAD_H

#include "BuildComBase.h"

class CThinkPad:public CBuildComBase
{
public:
    virtual void create_cpu() 
    {
        std::cout<<"thinkpad cpu"<<std::endl;
    }
    virtual void create_mem() 
    {
        std::cout<<"thinkpad mem"<<std::endl;
    }
    virtual void create_mainboard() 
    {
        std::cout<<"thinkpad mainboard"<<std::endl;
    }
    virtual void create_harddisk()  
    {
        std::cout<<"thindpad harddisk"<<std::endl;
    }

};
#endif

//mac: Mac.h
#ifndef __MAC_H
#define __MAC_H

#include "BuildComBase.h"

class CMac:public CBuildComBase
{
public:
    virtual void create_cpu()
    {
        std::cout<<"mac CPU"<<std::endl;
    }
    virtual void create_mem() 
    {
        std::cout<<"mac mem"<<std::endl;
    }
    virtual void create_mainboard()
    {
        std::cout<<"mac mainboard"<<std::endl;
    }
    virtual void create_harddisk()  
    {
        std::cout<<"mac harddisk"<<std::endl;
    }
};

#endif

//指挥者Dector.h 
#ifndef __DECTOR_H
#define __DECTOR_H

#include "BuildComBase.h"

class CDector
{
public:
    void create_builder(CBuildComBase* build)
    {
         create_buil(build);
    }
private:
    void create_buil(CBuildComBase* build)
    {
        build->create_cpu();
        build->create_mem();
        build->create_mainboard();
        build->create_harddisk();
        build->create_others();
    }
};

#endif

//client:客户端通过指挥者即可创建,而不用关注内部的创建细节

#include <iostream>
#include "Dector.h"
#include "Mac.h"
#include "ThinkPad.h"
#include "BuildComBase.h"

int main(void)
{
    CBuildComBase* mac = new CMac;
    CBuildComBase* thinkpad = new CThinkPad;
    CDector* dector = new CDector();
    std::cout<<"begin create thindpad:"<<std::endl;
    dector->create_builder(thinkpad);
    std::cout<<"begin create mac:"<<std::endl;
    dector->create_builder(mac);
    std::cout<<"create end"<<std::endl;
    return 0;
}
<think>好的,我现在需要回答用户的问题:“建造者模式与工厂模式的核心区别是什么?”首先,我得回顾一下这两个设计模式的基本概念应用场景。 用户之前的问题是关于在哪些场景下选择建造者模式而不是简单工厂,现在他们问到了两者的核心区别。这说明用户可能已经对这两个模式有了一定的了解,但需要更深入的对比来巩固他们的知识。 首先,我需要明确工厂模式建造者模式各自的定义。工厂模式主要是用来创建对象,将对象的创建与使用分离,隐藏对象的创建细节,用户只需要知道接口工厂类即可。而建造者模式则是将复杂对象的构建与其表示分离,允许用户通过指定步骤构建不同的对象。 接下来,我需要找出它们的核心区别。根据我的理解,区别可能包括: 1. **关注点不同**:工厂模式关注的是创建对象的种类,而建造者模式关注构建复杂对象的步骤过程。 2. **构建复杂度**:工厂模式适用于创建简单对象,而建造者模式处理多个步骤构建复杂对象的情况。 3. **控制粒度**:建造者模式允许更细粒度的控制对象的构建过程,而工厂模式通常是一步到位创建对象。 4. **产品多样性**:工厂模式创建的产品通常是同一接口的不同实现,而建造者模式可能生成不同配置的产品。 5. **接口设计**:工厂模式通常有一个创建对象的方法,而建造者模式有多个步骤方法,最后生成产品。 然后,我需要验证这些区别是否正确。例如,工厂模式确实更关注于对象的创建,而建造者模式关注构建过程建造者模式通常会有Director类来管理构建步骤,而工厂模式则没有。 接下来,我需要考虑示例代码。用户之前的例子中,建造者模式有Builder接口ConcreteBuilder类,以及Director类。而工厂模式可能是一个简单的Factory类,返回Product实例。例如: ```java // 工厂模式示例 interface Product {} class ConcreteProductA implements Product {} class ConcreteProductB implements Product {} class Factory { public Product createProduct(String type) { if (type.equals("A")) return new ConcreteProductA(); else if (type.equals("B")) return new ConcreteProductB(); return null; } } ``` 通过对比代码,可以更清楚两者的结构差异。工厂模式的Factory类直接负责创建对象,而建造者模式通过分步骤构建,最后调用getResult()。 另外,用户之前的问题中提到了建造者模式适用于复杂对象构建,而工厂模式适用于简单对象。因此,在回答时需要强调复杂对象分步骤构建的重要性。 还需要注意用户可能的疑问点,比如何时使用工厂模式,何时使用建造者模式。这时候需要结合场景,比如当对象创建步骤简单,只需要根据参数返回不同实例时,用工厂;当需要分步骤构建复杂对象时,用建造者。 最后,确保回答的结构符合用户的要求:先给出核心区别,然后示例代码,最后提出相关问题。相关问题需要围绕核心区别展开,帮助用户进一步理解两者的应用场景差异。</think>建造者模式与工厂模式的核心区别体现在以下五个维度: 1. **构建维度** 工厂模式聚焦对象的"种类创建"(如生产不同品牌的手机),建造者模式关注对象的"步骤构建"(如组装手机的CPU、屏幕、电池等组件)。 2. **过程控制** 工厂模式通过单一方法直接返回完整对象(如`createPhone()`),建造者模式通过分步骤方法(如`buildCPU()`、`buildCamera()`)逐步构造对象,最后调用`getResult()`获取成品。 3. **复杂度边界** 工厂模式适用于简单对象创建(如生成不同格式的文档实例),建造者模式处理复杂对象组合(如定制包含不同配置的汽车)。 4. **流程规范性** 建造者模式通过Director强制规范构建流程(如必须先装底盘再装车身),工厂模式无强制流程约束。 5. **扩展适应性** 新增产品时,工厂模式需修改工厂类(违反开闭原则),建造者模式只需新增具体建造者类(符合开闭原则)。 ```java // 工厂模式示例 interface Phone {} class iPhone implements Phone {} class AndroidPhone implements Phone {} class PhoneFactory { public Phone createPhone(String type) { return switch(type) { case "iOS" -> new iPhone(); case "Android" -> new AndroidPhone(); default -> throw new IllegalArgumentException(); }; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值