java 设计模式 建造者_java设计模式之-建造者模式

本文详细介绍了Java中的建造者模式,通过盖房子的例子阐述其原理,包括如何利用接口、抽象建造者、具体建造者和指挥者分离产品和建造过程,以及如何扩展到不同房型的实现。通过代码实例演示了如何创建和使用House ABuiler和HouseBBuilder。
摘要由CSDN通过智能技术生成

java的23种设计模式之建造者模式

设计模式遵循的几大原则

1:职责单一

2:接口隔离

3:依赖倒转

4:里氏替换

5:开闭原则

6:迪米特法则

设计模式的发展是依据以上原则而来,所以学习设计模式主要在于能够区分每个设计模式的共同点以及不同点,有些设计模式非常相似,只是侧重的点不同

学习他们需要学会总结,例如桥接模式和装饰模式

建造者模式:

首先了解什么样的场景下能够使用到建造者模式,现在有个需求,盖房子(经典的例子),现在假设盖房子需要的2个步骤,1:材料,2:大小

因为材料和大小的不一致,可以造出不同房型的房子(例如A房型:材料=【钢筋】, 大小=【大房子】; 例如B房型:材料=【砖块】, 大小=【小房子】)

问题分析:

造2个房型的房子,A房型和B房型,传统思想,创建一个House接口,让A房型实现House接口,让B房型也实现House接口就可以了。

但是从拓展的角度(偏向这个设计模式而言),现在我们还有其他房型的房子,例如 :材料=【钢筋】, 大小=【小房子】的C房型,从简单

设计上讲,我们可以再让C房型实现House接口,实际建造者强调的是建造过程(这里如果不用材料和大小更好解释:例如盖房子的过程:

打地基、铺水泥、贴瓷砖、盖房顶等,不同房子建造的过程不一样,有些毛坯可能不会贴瓷砖、有些不用打地基),最终我们是需要得到

这个房子,建造者模式侧重的产品和建造过程解耦

house类;

495611b4e2af87788a6587163982f6ea.png

Materials材料接口:有钢铁、有砖块;

ec8dcb022d1bef0c41f2d613daf4bb4d.png

Style风格大小接口:有大房子、有小房子

26b3c5d82e4dbffe0764c102567215ae.png

产品总体UML图:

24bd145be9515e4625a945a418ff7617.png

建造者总体UML图:

3a559a491cf3982c3de25bfdd5a85218.png

通过实现Builder(抽象建造者)接口,A房型和B房型的建造者创建出来了,Director(指挥者):通过指挥建造者创建合适的房子

总体UML图:

4abb99a03defe33095ffde23b841b1d0.png

以下为代码:

c660778dac1c9629720e86084bce5f5d.png

House :

package com.yangmin.builder;

public class House {

private Materials materials;

private Style style;

public Materials getMaterials() {

return materials;

}

public void setMaterials(Materials materials) {

this.materials = materials;

}

public Style getStyle() {

return style;

}

public void setStyle(Style style) {

this.style = style;

}

@Override

public String toString() {

return "House [materials=" + materials.getMaterials() + ", style=" + style.getStyle() + "]";

}

}

Materials :

package com.yangmin.builder;

public interface Materials {

public String getMaterials();

}

Style :

package com.yangmin.builder;

public interface Style {

public String getStyle();

}

Steel :

package com.yangmin.builder;

public class Steel implements Materials {

@Override

public String getMaterials() {

return "钢筋";

}

}

Brick :

package com.yangmin.builder;

public class Brick implements Materials {

@Override

public String getMaterials() {

return "砖块";

}

}

Big:

package com.yangmin.builder;

public class Big implements Style {

@Override

public String getStyle() {

return "大房子";

}

}

Small :

package com.yangmin.builder;

public class Small implements Style {

@Override

public String getStyle() {

return "小房子";

}

}

Builder :

package com.yangmin.builder;

public interface Builder {

public void makeMater();

public void makeStyle();

public House getHouse();

}

HouseABuiler :

package com.yangmin.builder;

public class HouseABuiler implements Builder {

private House house;

public HouseABuiler(House house) {

super();

this.house = house;

}

@Override

public void makeMater() {

house.setMaterials(new Steel());

}

@Override

public void makeStyle() {

house.setStyle(new Big());

}

@Override

public House getHouse() {

return this.house;

}

}

HouseBBuilder :

package com.yangmin.builder;

public class HouseBBuilder implements Builder {

private House house;

public HouseBBuilder(House house) {

super();

this.house = house;

}

@Override

public void makeMater() {

house.setMaterials(new Brick());

}

@Override

public void makeStyle() {

house.setStyle(new Small());

}

@Override

public House getHouse() {

return this.house;

}

}

Director :

package com.yangmin.builder;

public class Director {

private Builder builder;

public Director(Builder builder) {

this.builder = builder;

}

public House houseBuilder() {

builder.makeMater();

builder.makeStyle();

return builder.getHouse();

}

}

Client :

package com.yangmin.builder;

public class Client {

public static void main(String[] args) {

//户型A

Director director = new Director(new HouseABuiler(new House()));

House house = director.houseBuilder();

System.out.println("户型A:"+house);

//户型B

Director directorB = new Director(new HouseBBuilder(new House()));

House houseB = directorB.houseBuilder();

System.out.println("户型B:"+houseB);

}

}

结果输出:

户型A:House [materials=钢筋, style=大房子]

户型B:House [materials=砖块, style=小房子]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值