创建类模式大PK

  • 创建类模式包括工厂方法模式建造者模式抽象工厂模式单例模式原型模式,他们能够提供对象的创建和管理职责。其中单例模式和原型模式模式非常容易理解,单例模式是要保持在内存中只有一个对象,原型模式是通过复制的方式产生一个新的对象。而工厂方法模式、抽象工厂模式和建造者模式,这三者之间有较大的相似性。
工厂方法模式VS建造者模式
  • 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象。就拿造车来说吧,工厂方法模式,直接生产出来的就是奔驰、宝马和大众;而建造者模式则不同了,则需要创建车胎、引擎、车门、座椅、车灯等等,然后组装成一辆奔驰或者宝马车。如下我们分别介绍两种模式的造车过程。
  • 工厂方法模式造车

首先工厂方法模式的类图如下,其中我们将车辆分为三种奔驰、宝马、大众,定义一个接口,在定义三种车型的创建实现,通过汽车制造工厂生产汽车。通过类图代码略。

  • 建造者模式造车

建造者模式设计一个车需要先把车进行拆分,分为引擎、车轮和车体三部分,然后由建造者进行建造,并通过设计图纸建造车辆,注重零件的配合、组装和封装从一个细微构件角度看待一个对象,建造者模式的类图如下。

这个看起来还有点复杂呢,我们还是看看通用类图的源码吧,一点一点的分析一下,首先我们还是先看看这个奔驰和宝马汽车吧,还是把大众汽车给忘记了!源码还是挺简单的,就是一些get和set方法。

public interface ICar {
public String getWheel();
public String getEngine();
public String getCarbody();
} public class Benz implements ICar{
private Blueprint bp;
public Benz(Blueprint bp){
this.bp = bp;
}
@Override
public String getWheel() {
// TODO Auto-generated method stub
return this.bp.getWheel();
} @Override
public String getEngine() {
// TODO Auto-generated method stub
return this.bp.getEngine();
} @Override
public String getCarbody() {
// TODO Auto-generated method stub
return this.bp.getBody();
}
} public class BMW implements ICar{
private Blueprint bp;
public BMW(Blueprint bp){
this.bp = bp;
}
public String getBody() {
return this.bp.getBody();
}
public String getWheel() {
// TODO Auto-generated method stub
return this.bp.getWheel();
}
@Override
public String getEngine() {
// TODO Auto-generated method stub
return this.bp.getEngine();
}
@Override
public String getCarbody() {
// TODO Auto-generated method stub
return this.bp.getBody();
}
}

接下来我们看看我们重头戏CarBuilder,写起来发现也没有那么复杂了。

public abstract class CarBuilder {
private Blueprint bp;
public abstract ICar buildCar();
public void receiveBlueprint(Blueprint bp){
this.bp = bp;
}
protected Blueprint getBlueprint(){
return this.bp;
}
} public class BenzBuilder extends CarBuilder{ @Override
public ICar buildCar() {
// TODO Auto-generated method stub
return new Benz(super.getBlueprint());
}
} public class BMWBuilder extends CarBuilder{ @Override
public ICar buildCar() {
// TODO Auto-generated method stub
return new BMW(super.getBlueprint());
}
}

最后只剩下导演类了,看来最复杂的还是导演,要设计车辆的蓝图,并正确的调用建造方法。

public class Director {
private CarBuilder benzBuilder = new BenzBuilder();
private CarBuilder BMWbuilder = new BMWBuilder();
private Blueprint bp;
public ICar createBenz(){
bp = new Blueprint();
bp.setBody("BenzBody");
bp.setEngine("BenzEngine");
bp.setWheel("BenzWheel");
return createCar(benzBuilder, bp);
}
public ICar createBMW(){
bp = new Blueprint();
bp.setBody("BMWBody");
bp.setEngine("BMWEngine");
bp.setWheel("BMWWheel");
return createCar(BMWbuilder, bp);
}
private ICar createCar(CarBuilder carBuilder, Blueprint bp){
carBuilder.receiveBlueprint(bp);
return carBuilder.buildCar();
}
}

大功告成,我们通过客户端调用一下看看运行状况。

public class Client {

    /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Director director = new Director();
ICar benz = director.createBenz();
ICar BMW = director.createBMW();
System.out.println(benz.getCarbody()); //BenzBody
System.out.println(BMW.getCarbody()); //BMWBody
}
}
  • 最佳实践

工厂方法模式和建造者模式都属于对象创建类模式,都是用来创建类对象。但他们之间区别还是比较明显的。

    • 意图不同:工厂方法模式关注的是产品的整体,如宝马、大众车整体,无需关心产品的各个部分是如何创建出来的;但在建造者模式中,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是“由零件一步一步地组装出产品对象”。工厂方法模式创建对象粒度较粗,而建造者模式创建对象的粒度较细。
    • 产品的复杂度不同,工厂方法模式创建出来的宝马和奔驰车的样子是一样的,而建造者模式创建的宝马车和奔驰车可以分别指定不同的车体部分。
抽象工厂模式VS建造者模式

  抽象工厂模式实现对产品家族的创建,一个产品家族是一系列不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。我们生产的奔驰和宝马车当然不能各只有一种型号,奔驰车有商务车还有运动型车SUV,同样宝马车也是如此。因此我们需要改进工厂方法模式,引入抽象工厂模式生产车辆。抽象工厂模式类图如下:

  对外界调用者来说,只要更换了一个具备相同结构的对象,即可发生非常大的改变,如我们原本使用BenzFactory生产汽车,但是系统突然也生产宝马汽车,则只需要将BenzFactory替换为BMWFactory即可,注意这里生产的是一辆完整的车,对于一个产品,只要给出产品的代码即可生产,抽象工厂模式把一辆车认为是一个完整的,不可拆分的对象,注重完整性,不会出现一个宝马工厂生产奔驰车的情况,不能生产混合车型。而建造者模式可以将不同车型的零件任意组合。如果希望屏蔽对象的创建过程,只提供一个封装良好的对象,则可以选择抽象工厂模式。而建造者模式可以用在构件的装配方面,如通过装配不同的组件或者相同组件的不同顺序,可以产生出一个新的对象,是一个非常灵活的架构,方便地扩展和维护系统。

设计模式之创建类模式大PK的更多相关文章

  1. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  2. 设计模式之结构类模式大PK

                                      结构类模式大PK 结构类模式包括适配器模式.桥梁模式.组合模式.装饰模式.门面模式.享元模式和代理模式.之所以称其为结构类模式,是因 ...

  3. 创建类模式大PK(总结)

    创建类模式包含工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,它们都可以提供对象的创建和管理职责.当中的单例模式和原型模式很easy理解,单例模式是要保持在内存中仅仅有一个对象,原型模式是 ...

  4. 第26章 创建型模式大PK

    26.1 工厂方法模式 VS 建造者模式 26.1.1 按工厂方法建造超人 (1)产品:两类超人,成年超人和未成年超人. (2)工厂:这里选择简单工厂 [编程实验]工厂方法建造超人 //创建型模式大P ...

  5. 设计模式之创建类模式PK

    创建类模式包括: 工厂方法模式 建造者模式 抽象工厂模式 单例模式 原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型 ...

  6. ZT 创建类模式总结篇

    创建类模式总结篇 分类: 设计模式 2012-03-26 09:03 7320人阅读 评论(11) 收藏 举报 编程优化设计模式任务 创建类模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户 ...

  7. 第28章 行为型模式大PK

    27.1 策略模式 VS 命令模式 27.1.1 策略模式实现压缩算法 //行为型模式大PK——策略模式和命令模式 //实例:用策略模式实现压缩算法 #include <iostream> ...

  8. 第27章 结构型模式大PK

    27.1 代理模式 VS 装饰模式 27.1.1 代理模式 (1)场景:客人找运动员代理要求安排运动员参加比赛 (2)说明:代理人有控制权,可以拒绝客人的要求,也可以答应安排,甚至自己下去跑(因为有些 ...

  9. 设计模式之行为类模式PK

    行为类模式包括: 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式 行为型模式涉及到算法和对象间职责的分配 行为类模式关注 ...

随机推荐

  1. ABP教程-打造一个《电话簿项目》-目录-MPA版本-基于ABP1.13版本

    此系列文章会进行不定期的更新,应该会有6章左右. 感兴趣的朋友可以跟着看看,本教程适合已经看过ABP的文档但是又无从下手的小伙伴们. 初衷: 发布系列教程的原因是发现ABP在园子火了很久,但是发现还是 ...

  2. Node.js:path、url、querystring模块

    Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...

  3. 移动端访问PC站点时自动跳转至移动站点

    方法一: 百度Site APP的uaredirect.js 实现手机访问,自动跳转 <script src="http://siteapp.baidu.com/static/webap ...

  4. CGI与FastCGI nginx+PHP-FPM

    本文转载自CGI与FastCGI 1.当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html. ...

  5. Java程序员:工作还是游戏,是该好好衡量一下了

    前阵子我终于下定决心,删掉了硬盘里所有的游戏. 身为一个程序猿,每天都要和各种新技术打交道,闲暇时间,总还得看一下各大论坛,逛逛博客园啥的,给自己充充电.游戏的话,其实我自小就比较喜欢,可以算是一种兴 ...

  6. AlloyTouch实战--60行代码搞定QQ看点资料卡

    原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/kandian 先验货 访问DEMO你也可以点击这里 源代码可以点击这里 如你体验所见,流程的滚动的 ...

  7. HTML5游戏源码 飞翔的字母 可自定义内容

    相信大家都玩过飞翔的小鸟吧,当然,可能已经有很多人因为这个游戏砸了不少手机.吼吼. 废话不多说,回到主题,源码如下. 博客园上传空间大小有限制,没法上传了,需要打包源码的朋友们请留言邮箱地址.当然还有 ...

  8. 【MySql】查询数据库中所有表及列的信息

    SELECT TABLE_NAME, -- 表名 COLUMN_NAME, -- 字段名 DATA_TYPE, -- 字段类型 COLUMN_COMMENT -- 字段注释 FROM INFORMAT ...

  9. [转]Java常用工具类集合

    转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...

  10. Web 前端攻防(2014版)

    在百度 FEX 团队时写的.有次让我写点前端开发中注意的安全规范,结果写着写着就跑题了,写了一堆纯前端实现的攻击方式...当然还有防范措施. 文章就懒得粘过来了~ 直接贴个地址算了:) http:// ...