ホームページ >Java >&#&チュートリアル >Spring Boot でのプロトタイプ設計パターンの実装

Spring Boot でのプロトタイプ設計パターンの実装

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-30 22:44:16675ブラウズ

導入

アプリケーション開発では、オブジェクト作成の管理が複雑になる可能性があり、特に、ほぼ同一であるものの特定の詳細が異なるインスタンスを扱う場合は複雑になります。プロトタイプ デザイン パターンは、既存のオブジェクトをコピー、つまり「複製」することで新しいオブジェクトを作成できるようにすることで、解決策を提供します。このパターンは、オブジェクトの作成にコストがかかる場合、または大規模な初期化が必要な場合に特に便利です。

この記事では、実際の電子商取引のユースケース、つまり製品バリアントの作成と永続化を使用して、Spring Boot アプリケーションにプロトタイプ デザイン パターンを実装する方法を検討します。この例を通じて、プロトタイプ パターンの基礎だけでなく、実際のアプリケーションでオブジェクトの作成を効率化する方法についても学びます。

プロトタイプの設計パターンを理解する

プロトタイプ パターンは、プロトタイプと呼ばれる既存のオブジェクトのクローンを作成することで新しいインスタンスを作成できる創造的なデザイン パターンです。このアプローチは、さまざまなプロパティを持つ基本オブジェクトがあり、各バリアントを最初から作成するのは冗長で非効率的である場合に特に便利です。

Java では、このパターンは多くの場合、Cloneable インターフェイスを使用するか、カスタム クローン メソッドを定義することによって実装されます。主なアイデアは、元のオブジェクトをそのままにして、変更を加えて複製できる「青写真」を提供することです。

プロトタイプ パターンの主な利点:

  1. 初期化時間の短縮: オブジェクトを最初から作成するのではなく、既存のインスタンスを複製して変更することで、初期化時間を節約します。

  2. オブジェクト作成ロジックをカプセル化します: インスタンス化の詳細を隠したまま、オブジェクト自体の中でオブジェクトを複製する方法を定義します。

  3. パフォーマンスの向上: 製品バリアントなど、類似したオブジェクトを頻繁に作成するアプリケーションの場合、プロトタイプ パターンによりパフォーマンスが向上します。

E コマースの使用例: 製品バリエーションの管理

基本製品にさまざまな構成または「バリエーション」がある電子商取引プラットフォームを想像してください。たとえば、さまざまな色、ストレージ オプション、保証期間を持つスマートフォンなどです。各バリアントを最初から再作成するのではなく、基本プロダクトのクローンを作成し、必要に応じて特定のフィールドを調整できます。こうすることで、共有属性の一貫性が保たれ、バリアント固有の詳細のみが変更されます。

この例では、プロトタイプ パターンを使用して製品バリアントを作成および保持するための単純な Spring Boot サービスを構築します。

Spring Boot でのプロトタイプ パターンの実装

ステップ 1: 基本プロダクトの定義

まず、ID、名前、色、モデル、ストレージ、保証、価格など、製品に必要なフィールドを含む Product クラスを定義します。製品のコピーを作成するための cloneProduct メソッドも追加します。

public interface ProductPrototype extends Cloneable {
    ProductPrototype cloneProduct();
}
@Entity
@Table(name = "products")
@Data
public class Product implements ProductPrototype {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "product_id")
    private Long productId;

    @Column(name = "name")
    private String name;

    @Column(name = "model")
    private String model;

    @Column(name = "color")
    private String color;

    @Column(name = "storage")
    private int storage;

    @Column(name = "warranty")
    private int warranty;

    @Column(name = "price")
    private double price;

    @Override
    public ProductPrototype cloneProduct() {
        try {
            Product product = (Product) super.clone();
            product.setId(null); // database will assign new Id for each cloned instance
            return product;
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}

この設定では:

cloneProduct: このメソッドは Product オブジェクトのクローンを作成し、ID を null に設定して、データベースがクローン化されたインスタンスごとに新しい ID を確実に割り当てるようにします。

ステップ 2: バリアントを処理するサービスの作成

次に、バリアントを保存するメソッドを含む ProductService を作成します。このメソッドは、ベース商品のクローンを作成し、バリアント固有の属性を適用して、新しい商品として保存します。

public interface ProductService {

    // For saving the base product
    Product saveBaseProduct(Product product);

    // For saving the variants
    Product saveVariant(Long baseProductId, VariantRequest variant);
}
@Log4j2
@Service
public class ProductServiceImpl implements ProductService {

    private final ProductRepository productRepository;

    public ProductServiceImpl(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    /**
     * Saving Base product, Going to use this object for cloning
     *
     * @param product the input
     * @return Product Object
     */
    @Override
    public Product saveBaseProduct(Product product) {
        log.debug("Save base product with the detail {}", product);
        return productRepository.save(product);
    }

    /**
     * Fetching the base product and cloning it to add the variant informations
     *
     * @param baseProductId baseProductId
     * @param variant       The input request
     * @return Product
     */
    @Override
    public Product saveVariant(Long baseProductId, VariantRequest variant) {
        log.debug("Save variant for the base product {}", baseProductId);
        Product baseProduct = productRepository.findByProductId(baseProductId)
                .orElseThrow(() -> new NoSuchElementException("Base product not found!"));

        // Cloning the baseProduct and adding the variant details
        Product variantDetail = (Product) baseProduct.cloneProduct();
        variantDetail.setColor(variant.color());
        variantDetail.setModel(variant.model());
        variantDetail.setWarranty(variant.warranty());
        variantDetail.setPrice(variant.price());
        variantDetail.setStorage(variant.storage());

        // Save the variant details
        return productRepository.save(variantDetail);
    }
}

このサービスでは:

saveVariant: このメソッドは、ID によってベース製品を取得し、クローンを作成し、バリアントの詳細を適用して、データベース内の新しいエントリとして保存します。

ステップ 3: バリアントを作成するためのコントローラー

シンプルな REST コントローラーを作成して、バリアント作成 API を公開します。

@RestController
@RequestMapping("/api/v1/products")
@Log4j2
public class ProductController {

    private final ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @PostMapping
    public ResponseEntity<Product> saveBaseProduct(@RequestBody Product product) {
        log.debug("Rest request to save the base product {}", product);
        return ResponseEntity.ok(productService.saveBaseProduct(product));
    }

    @PostMapping("/{baseProductId}/variants")
    public ResponseEntity<Product> saveVariants(@PathVariable Long baseProductId, @RequestBody VariantRequest variantRequest) {
        log.debug("Rest request to create the variant for the base product");
        return ResponseEntity.ok(productService.saveVariant(baseProductId, variantRequest));
    }
}

こちら:

saveVariant: このエンドポイントは、指定された製品のバリアントを作成するための HTTP POST リクエストを処理します。作成ロジックを ProductService に委任します。

プロトタイプ パターンを使用する利点

この実装により、いくつかの明らかな利点がわかります。

コードの再利用性: Product クラスにクローン作成ロジックをカプセル化することで、サービス層とコントローラー層でのコードの重複を回避します。

メンテナンスの簡素化: プロトタイプ パターンはクローン作成ロジックを一元化し、オブジェクト構造への変更の管理を容易にします。

効率的なバリアント作成: 新しいバリアントはそれぞれ基本プロダクトのクローンであるため、冗長なデータ入力が削減され、共有属性間の一貫性が確保されます。

プログラムを実行する

Gradle を使用して Spring Boot プロジェクトをビルドする

./gradlew build
./gradlew bootRun

RESTクライアント経由で実行

基本製品を保存

curl --location 'http://localhost:8080/api/v1/products' \
--header 'Content-Type: application/json' \
--data '{
    "productId": 101,
    "name": "Apple Iphone 16",
    "model": "Iphone 16",
    "color": "black",
    "storage": 128,
    "warranty": 1,
    "price": 12.5
}'

バリアントを保存

curl --location 'http://localhost:8080/api/v1/products/101/variants' \
--header 'Content-Type: application/json' \
--data '{
    "model": "Iphone 16",
    "color": "dark night",
    "storage": 256,
    "warranty": 1,
    "price": 14.5
}'

結果 (新しいバリアントは問題なく存続しました)

Implementing the Prototype Design Pattern in Spring Boot

GitHub リポジトリ

製品バリアントのプロトタイプ設計パターンの完全な実装は、次の GitHub リポジトリで見つけることができます。

GitHub リポジトリ リンク

LinkedIn でフォローしてください

ソフトウェア開発、デザインパターン、Spring Boot に関する記事、チュートリアル、洞察をさらに知りたい場合は、常につながりを保って私をフォローしてください:

LinkedIn でフォローしてください

結論

プロトタイプ デザイン パターンは、電子商取引アプリケーションの製品バリアントなど、オブジェクトの重複が頻繁に発生する場合に強力なツールです。このパターンを Spring Boot アプリケーションに実装することで、オブジェクト作成の効率とコードの保守性の両方が向上します。このアプローチは、小さな変化を伴う同様のオブジェクトの作成が必要なシナリオで特に役立ち、現実世界のアプリケーション開発にとって貴重な手法となります。

以上がSpring Boot でのプロトタイプ設計パターンの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。