首页 > 编程语言 >Java设计模式-建造者模式

Java设计模式-建造者模式

时间:2023-05-24 22:35:22浏览次数:73  
标签:Java 对象 创建 void 建造 模式 设计模式 public

img

简介

建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通过将复杂对象的构建过程分解为多个简单的步骤来实现。

与其他创建型模式不同,建造者模式强调的是将构建过程与表示分离,而不是将对象与其构建方式分离。这使得建造者模式在需要创建多个相似对象时非常有用,因为可以通过重用相同的构建过程来创建不同的对象表示。

建造者模式与工厂模式和抽象工厂模式非常相似,它们都是用来创建对象的。然而,它们之间存在一些区别:

  • 工厂模式和抽象工厂模式用于创建不同类型的对象,而建造者模式用于创建同一类型的不同表示。
  • 工厂模式和抽象工厂模式只有一个创建方法,而建造者模式通常有多个创建方法。
  • 工厂模式和抽象工厂模式通常创建完整的对象,而建造者模式创建对象的过程是分步的。

实现

假设我们正在构建一个游戏,游戏中有多种类型的角色,每种角色都有不同的属性和装备。为了避免在创建每个角色时重复的代码,我们可以使用建造者模式。

下面是一个简单的示例,它演示了如何使用建造者模式创建不同类型的游戏角色:

public interface RoleBuilder {
    void setName(String name);
    void setHealth(int health);
    void setAttack(int attack);
    void setDefense(int defense);
    void setEquipment(String equipment);
    Role build();
}

public class WarriorBuilder implements RoleBuilder {
    private Role role = new Role();

    public void setName(String name) {
        role.setName(name);
    }

    public void setHealth(int health) {
        role.setHealth(health);
    }

    public void setAttack(int attack) {
        role.setAttack(attack);
	}

	public void setDefense(int defense) {
    	role.setDefense(defense);
	}

	public void setEquipment(String equipment) {
    	role.setEquipment(equipment);
	}

	public Role build() {
    	return role;
	}
}

public class Role {
	private String name;
	private int health;
	private int attack;
	private int defense;
	private String equipment;
    // getters and setters
}

public class Game {
	public static void main(String[] args) {
		RoleBuilder warriorBuilder = new WarriorBuilder();
		RoleBuilder mageBuilder = new MageBuilder();
        // Create a warrior
    	warriorBuilder.setName("Warrior");
    	warriorBuilder.setHealth(100);
    	warriorBuilder.setAttack(10);
    	warriorBuilder.setDefense(5);
    	warriorBuilder.setEquipment("Sword");
    	Role warrior = warriorBuilder.build();

    	// Create a mage
    	mageBuilder.setName("Mage");
    	mageBuilder.setHealth(80);
    	mageBuilder.setAttack(20);
    	mageBuilder.setDefense(3);
    	mageBuilder.setEquipment("Staff");
    	Role mage = mageBuilder.build();
	}
}

在上面的示例中,我们使用了RoleBuilder接口来定义了创建Role对象的方法,然后我们创建了两个具体的建造者WarriorBuilderMageBuilder,它们分别用于创建战士和法师。最后,我们使用这些建造者来创建不同类型的游戏角色。

优缺点

优点

  • 可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
  • 可以更容易地控制对象的创建过程,同时使得代码更易于维护和扩展。
  • 可以避免在创建对象时重复的代码,提高了代码的复用性。

缺点

  • 建造者模式的代码结构较为复杂,需要创建多个类来实现。
  • 当需要创建的对象较为简单时,建造者模式可能会显得过于繁琐。

运用场景

建造者模式通常适用于以下情况:

  • 当需要创建多个相似对象时,例如使用相同的构建过程创建不同的表示。
  • 当创建一个对象需要多个步骤时,例如需要设置多个属性或调用多个方法。
  • 当需要在不同的上下文中创建不同的对象表示时,例如根据用户的选择创建不同的表示。
  • 当需要控制对象的创建过程,并且希望代码易于维护和扩展时。

总结

建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离。它通过将复杂对象的构建过程分解为多个简单的步骤来实现。在Java中,我们可以使用建造者模式来创建复杂对象,并且可以根据需要使用不同的建造者来创建不同的表示。建造者模式的优点包括可重用性和易于维护和扩展,但它的缺点是代码结构较为复杂。建造者模式适用于需要创建多个相似对象,或者需要在不同的上下文中创建不同的对象表示的情况。如果需要创建的对象较为简单,可能会使用建造者模式变得过于繁琐。

总之,建造者模式是一种非常有用的设计模式,可以帮助我们更好地管理对象的构建过程,并且使得代码更加易于维护和扩展。如果你需要创建一个复杂的对象,或者需要在不同的上下文中创建不同的对象表示,建议你考虑使用建造者模式来实现。

标签:Java,对象,创建,void,建造,模式,设计模式,public
From: https://blog.51cto.com/u_10217684/6343070

相关文章

  • Java笔记(七):多线程
    Java默认有2个线程:main+GC并发:CPU单核,交替执行并行:CPU多核,多个线程可以同时执行(提高使用效率:线程池)Runtime.getRuntime().availableProcessors()//当前CPU可用核数多线程实现方式继承Thread类,重写run方法这样代码的写法简单,符合大家的习惯,但是直接继承Thread类有一......
  • java基于springboot+vue的书籍学习平台管理系统,学期学习论坛管理系统,附源码+数据库+lw
    1、项目介绍困扰管理层的许多问题当中,书籍学习将会是不敢忽视的一块。但是管理好书籍学习又面临很多麻烦需要解决,在工作琐碎,记录繁多的情况下将书籍学习的当前情况反应给相关部门决策,等等。在此情况下开发一款书籍学习平台,于是乎变得非常合乎时宜。经过网上调查和搜集数据,......
  • 《设计模式之禅》Singleton_Pattern--单例模式
    单例模式这个模式是很有意思,确实很有意思的,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝(就是那个天子)中国的历史上很少出现两个皇帝并存的......
  • springboot项目启动报错java.lang.NoSuchMethodError: org.springframework.boot.buil
    产生此问题的原因是由于springboot版本兼容性导致的:java.lang.NoSuchMethodError:org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V2019-08-2918:04:54.089ERROR[restartedMain][SpringApplication.java:842]-Applicationrunfail......
  • java 多重 if 判断代码怎么优化?
    看来大家需要重温Java基础知识啦,给大家分享几种方法,可以用于优化 Java 多重 if 判断代码的情况:1. 使用 switch-case 语句替代多重 if 判断。如果需要判断的变量是一个整型或枚举类型,可以使用 switch-case 语句替代多重 if 判断。这样可以提高代码可读性和执行效......
  • 在java中String类为什么要设计成final?Java面试常见问题
    其实在Java中,String类被final修饰,主要是为了保证字符串的不可变性,进而保证了它的安全性。那么final到底是怎么保证字符串安全性的呢?接下来就让我们一起来看看吧。一. final的作用1. final关键词修饰的类不可以被其他类继承,但是该类本身可以继承其他类,通俗地说就是这个类可以......
  • java 如何实现短函数调用?
    在Java中,可以使用lambda表达式来实现短函数调用。Lambda表达式是一个匿名函数,它可以传递给方法或存储在变量中,以便在需要时使用。不多说废话!!下面直接给大家示范一下,如何使用Lambda表达式实现短函数调用:在上面这段代码中:首先我们自定义一个函数接口TestInterface;在这个接口中......
  • Java Web三大组件之Filter过滤器
    JavaWeb三大组件(Servlet、Filter、Listener)1、Filter过滤器概念生活中的过滤器:净水器,空气净化器,大山里的土匪等JavaWeb中的过滤器:当浏览器访问服务器资源时,过滤器就会拦截浏览器发过来的请求,实现一些特别的功能作用:一般用于完成通用的操作,如登录验证,身份验证,统一字符编码和敏感字......
  • Cause: java.sql.SQLException: Invalid value for getInt()
    Cause:java.sql.SQLException:InvalidvalueforgetInt()-'锛?';SQL[];InvalidvalueforgetInt()-'锛';nestedexceptionisjava.sql.SQLException:InvalidvalueforgetInt()-'锛?' 在对错误进行排查时,有以下原因可能导致的原因:出现此问题的原因是因为MyB......
  • Java注解
    注解的理解(1)、注解也被称为元数据,用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息,附加在代码中的一些元信息(2)、和注释一样,注解不影响程序的逻辑,但注解可以被编译或运行,相当于嵌在代码中的补充信息@Overried(1)、Override只能用在方法上,用于重写父类的方法(可以是直......