1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Email {
  5. private:
  6. string title;
  7. /*这里是一个指针,当经行拷贝时,会产生另一个指针也指向它堆对应的地址。
  8. 当用户删除原来的指针时,会把对象里面的这个指针也删除,那么此时,第二个指向里面的对象就会丢失对象中的int指针。
  9. */
  10. int* pNumber;
  11. public:
  12. Email(string title) {
  13. this->title = title;
  14. this->pNumber = new int(666);
  15. }
  16. Email(const Email& email) {
  17. this->title = email.title;
  18. this->pNumber = email.pNumber;
  19. }
  20. ~Email() {
  21. delete pNumber;
  22. }
  23. };
  24. int main() {
  25. Email e1("message");
  26. Email e2 = e1;
  27. return 0;
  28. }
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Student implements Cloneable{//想要拷贝就得实现这个接口
  4. private String name;
  5. private int age;
  6. private String gender;
  7. private List<String> friends;
  8. public Student clone() throws CloneNotSupportedException{
  9. Student student=(Student) super.clone();
  10. List<String> new_friends=new ArrayList<String>();//在这里自己重新开辟一个新的对象,把新的对象赋给新cpoy的Students
  11. for(String friends:this.getFriends()){
  12. new_friends.add(friends);//把以前的list中的数据拷贝到新的friends中去
  13. }
  14. student.setFriends(new_friends);
  15. return student;//把加工后的student返回
  16. }
  17. //set、get方法略
  18. }
  19. ////////////////////////////////////////////////////////////////////////////
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. public class Main {
  23. public static void main(String[] args) {
  24. Student s1=new Student();
  25. /*Student s2=s1;
  26. System.out.println(s1==s2);//true,指向的是堆里面的同一个对象的地址*/
  27. //继承了Cloneable方法
  28. List<String> friends=new ArrayList<String>();
  29. friends.add("swift");
  30. friends.add("jack");
  31. s1.setFriends(friends);
  32. Student s2=s1.clone();//调用Java给的克隆方法实现克隆
  33. System.out.println(s1==s2);//false
  34. System.out.println(s1.getFriends());//[swift, jack]
  35. System.out.println(s2.getFriends());//[swift, jack]
  36. friends.add("newFriend");
  37. s1.setFriends(friends);//对s1更改,看s2是否变化
  38. System.out.println(s1.getFriends());
  39. System.out.println(s2.getFriends());//s2也变了,说明两个对象指向的是同一个friends对象
  40. //对clone方法更改后,发现s2没有变化了,说明他们两个student对象独立了
  41. /*false
  42. [swift, jack]
  43. [swift, jack]
  44. [swift, jack, newFriend]
  45. [swift, jack]*/
  46. }
  47. }

是指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

建造者(Builder)模式的主要角色:

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。

  2. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。

  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。

  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

(1) 产品角色:包含多个组成部件的复杂对象。

  1. //Actor类
  2. public class Actor {
  3. private String type;
  4. private String sex;
  5. private String face;
  6. private String costume;
  7. private String hairstyle;
  8. //set.get方法略
  9. }

(2) 抽象建造者:包含创建产品各个子部件的抽象方法。

  1. //ActorBuilder 类
  2. public abstract class ActorBuilder {
  3. Actor actor = new Actor(); //创建角色对象
  4. public abstract void BuildType();
  5. public abstract void BuildSex();
  6. public abstract void BuildFace();
  7. public abstract void BuildCostume();
  8. public abstract void BuildHairstyle();
  9. //返回角色对象
  10. public Actor CreateActor(){
  11. return actor;
  12. }
  13. }

(3) 具体建造者:实现了抽象建造者接口。

  1. //DevilBuilder类
  2. public class DevilBuilder extends ActorBuilder{
  3. @Override
  4. public void BuildType() {
  5. this.actor.setType("恶魔");
  6. }
  7. @Override
  8. public void BuildSex() {
  9. this.actor.setSex("男");
  10. }
  11. // BuildFace()、BuildCostume()、BuildHairstyle()省略
  12. @Override
  13. public Actor CreateActor() {
  14. BuildType();BuildSex();BuildFace();BuildCostume();BuildHairstyle();
  15. return this.actor;
  16. }
  17. ////////////////////////////////////////
  18. //AngelBuilder类
  19. public class AngelBuilder extends ActorBuilder{
  20. //省略。。。
  21. }

(4) 指挥者:调用建造者中的方法完成复杂对象的创建。

  1. //ActorController类
  2. public class ActorController {
  3. public Actor Construct(ActorBuilder ab){
  4. return ab.CreateActor();
  5. }
  6. }

(5) 客户类。

  1. // Client测试类
  2. public class Client {
  3. public static void main(String[] args) {
  4. ActorController ac = new ActorController();
  5. ActorBuilder ab = new DevilBuilder();
  6. Actor actor = ac.Construct(ab);
  7. System.out.println(actor);
  8. }
  9. }

区别:

  • 建造者模式更加注重方法的调用顺序,工厂模式注重创建对象。
  • 创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样
  • 关注重点不一样,工厂模式只需要把对象创建出来就可以了,而建造者模式不仅要创建出对象,还要知道对象由哪些部件组成。
  • 建造者模式根据建造过程中的顺序不一样,最终对象部件组成也不一样。

版权声明:本文为52yu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/52yu/p/14779200.html