ArkTs建造者模式,初出茅庐

999 阅读2分钟

ArkTS中建造者模式实现主要依托面向对象特性和链式调用语法,结合设计模式核心要素实现。以下是关键实现要点及示例说明:

一、核心角色定义

  1. 产品(Product) ‌ 定义需要构造的复杂对象,包含多个部件属性:
   class Computer {
       cpu: string = "";
       memory: string = "";
       storage: string = "";
   }

2. ‌抽象建造者(Builder) ‌ 声明构建部件方法的标准接口:

   interface ComputerBuilder {
       setCPU(cpu: string): ComputerBuilder;
       setMemory(memory: string): ComputerBuilder;
       setStorage(storage: string): ComputerBuilder;
       build(): Computer;
   }

3. ‌具体建造者(ConcreteBuilder) ‌ 实现链式调用并维护产品实例:

    class StandardComputerBuilder implements ComputerBuilder {
       private computer: Computer = new Computer();
   
       setCPU(cpu: string): this {
           this.computer.cpu = cpu;
           return this;
       }
   
       setMemory(memory: string): this {
           this.computer.memory = memory;
           return this;
       }
   
       setStorage(storage: string): this {
           this.computer.storage = storage;
           return this;
       }
   
       build(): Computer {
           return this.computer;
       }
   }

4. ‌指挥者(Director,可选) ‌ 封装构建过程标准化逻辑:

class ComputerDirector {
    constructGamingPC(builder: ComputerBuilder): Computer {
       return builder
               .setCPU("i9-13900K")
               .setMemory("32GB DDR5")
               .setStorage("2TB NVMe SSD")
               .build();
     }
 }

二、使用方式

  1. 直接链式调用
   let gamingPC = new StandardComputerBuilder()
       .setCPU("Ryzen 9 7950X")
       .setMemory("64GB DDR5")
       .setStorage("4TB SSD")
       .build();

2. ‌通过指挥者调用

   let director = new ComputerDirector();
   let officePC = director.constructGamingPC(new StandardComputerBuilder());

3. ‌在ide里面调试调用

aboutToAppear(): void {
  let gamingPC = new StandardComputerBuilder()
    .setCPU("Ryzen 9 7950X")
    .setMemory("64GB DDR5")
    .setStorage("4TB SSD")
    .build();
​
  console.log(TAG+"cpu"+gamingPC.cpu);
  console.log(TAG+"Memory"+gamingPC.memory);
  console.log(TAG+"Storage"+gamingPC.storage);
​
}

3.1 ‌查看调用效果日志

image-20250510123519094

4完整代码

const  TAG="main";
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
​
  aboutToAppear(): void {
    let gamingPC = new StandardComputerBuilder()
      .setCPU("Ryzen 9 7950X")
      .setMemory("64GB DDR5")
      .setStorage("4TB SSD")
      .build();
​
    console.log(TAG+"cpu"+gamingPC.cpu);
    console.log(TAG+"Memory"+gamingPC.memory);
    console.log(TAG+"Storage"+gamingPC.storage);
​
​
​
  }
​
  build() {
    RelativeContainer() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.message = 'Welcome';
        })
    }
    .height('100%')
    .width('100%')
  }
}
​
​
class Computer {
  cpu: string = "";
  memory: string = "";
  storage: string = "";
}
​
interface ComputerBuilder {
  setCPU(cpu: string): ComputerBuilder;
  setMemory(memory: string): ComputerBuilder;
  setStorage(storage: string): ComputerBuilder;
  build(): Computer;
}
​
class StandardComputerBuilder implements ComputerBuilder {
  private computer: Computer = new Computer();
​
  setCPU(cpu: string) {
    this.computer.cpu = cpu;
    return this;
  }
​
  setMemory(memory: string) {
    this.computer.memory = memory;
    return this;
  }
​
  setStorage(storage: string) {
    this.computer.storage = storage;
    return this;
  }
​
  build(): Computer {
    return this.computer;
  }
}

三、优势特性

  1. 灵活扩展性‌ 可定义多个具体建造者(如HighEndComputerBuilderBudgetComputerBuilder)实现不同配置组合15;
  2. 代码可读性‌ 链式调用语法使配置过程更符合自然语言逻辑;
  3. 构建解耦‌ 指挥者可复用同一构建流程生成不同产品,分离业务逻辑与对象构造细节。

四、适用场景

  • 需要生成的对象具有复杂内部结构(如自定义UI组件组合)4;
  • 相同构建过程需要产生不同表示形式(如不同设备适配的布局方案)1;
  • 对象属性需分步骤渐进式设置(如异步加载配置项

最后总结

arkts的建造者模式和我们的Java语言很像 思路是一样的只是语法不一样,我们把握好 产品 抽象构造者,具体构造者 ,和指挥者即可实现我们的建造这么模式,我们的鸿蒙next 中arkts的建造者模式,今天的文章就讲到这里有兴趣的 关注我B站教程。谢谢