デザインモードのビルダーモードを再学習するための30日

ビルダーモード

ビルダーモードは、作成モードの一種です。複数の単純なオブジェクトを使用して複雑なオブジェクトを徐々に構築することができ、Builderクラスは徐々に最終的なオブジェクトに構築されます。Builderクラスは他のオブジェクトから独立しています。

ビルダーモードはいつ使用されますか?通常、いくつかの基本的な材料が変わらず、それらの組み合わせが頻繁に変わる場合、これは長所または短所と見なすことができます。ビルダーモードは単一責任の原則と再利用性を満たし、ビルダーは比較的独立しています。ただし、素材や組み合わせが徐々に増えるため、メンテナンスが比較的面倒になります。

日常生活、新しい家の装飾スタイル、KFCマクドナルドのハンバーガー定食、またはスターバックスのアフタヌーンティー定食では、これらの例の材料は通常固定されており、さまざまな食事のセットを組み合わせて作成できます。

スターバックスのアフタヌーンティーパッケージには、コーヒーとケーキが含まれており、種類、パッケージ、価格が異なります。さまざまな種類のコーヒーとケーキを組み合わせることで、ビルダーモードを実現できます。

スターバックスパッケージは、ビルダーモードを実装しています。

//套餐接口
public interface Item {
    
    

    String name();

    Package packaging();

    float price();

}

//包装接口
public interface Package {
    
    

    String packaging();
}

次に、さまざまなアイテムのパッケージを定義します

//瓶子
public class Bottle implements Package {
    
    
    @Override
    public String packaging() {
    
    
        return "Bottle";
    }
}

//盒子
public class Wrapper implements Package {
    
    
    @Override
    public String packaging() {
    
    
        return "Wrapper";
    }
}

パッケージのインターフェースを定義した後、アイテムを定義する必要があります

//拿铁咖啡
public class Latte extends Coffee {
    
    
    @Override
    public String name() {
    
    
        return "Latte";
    }

    @Override
    public float price() {
    
    
        return 32;
    }
}

//卡布奇诺
public class Cappuccino extends Coffee {
    
    
    @Override
    public String name() {
    
    
        return "Cappuccino";
    }

    @Override
    public float price() {
    
    
        return 36;
    }
}

//汤圆蛋糕
public class Socake extends Cake {
    
    
    @Override
    public String name() {
    
    
        return "Socake";
    }

    @Override
    public float price() {
    
    
        return 35;
    }
}

//草莓蛋糕
public class StrawberryCake extends Cake {
    
    
    @Override
    public String name() {
    
    
        return "StrawberryCake";
    }

    @Override
    public float price() {
    
    
        return 36;
    }
}

これらの商品は、さまざまなパッケージで構成してから、パッケージを作成できます。

public class Order {
    
    
    //订单存放coffee 和 cake
    private List<Item> itemList = new ArrayList<>();

    //商品添加到套餐中
    public void add(Item item){
    
    
        itemList.add(item);
    }
    //获取总价
    public float getTotal(){
    
    
        float total = 0;
        for (Item i: itemList) {
    
    
            total += i.price();
        }
        return total;
    }
    //打印订单
    public void print(){
    
    
        for (Item item : itemList) {
    
    
            System.out.print("Item : "+item.name());
            System.out.print(", Packing : "+item.packaging().packaging());
            System.out.println(", Price : "+item.price());
        }
    }
}

Builderクラスを作成します

//创建套餐Builder
public class OrderBuilder {
    
    

    //汤圆蛋糕配卡布奇诺套餐
    public Order SoCake_Cappuccino(){
    
    
        Order order = new Order();
        order.add(new Cappuccino());
        order.add(new Socake());
        return order;
    }
    
    //拿铁配草莓蛋糕套餐
    public Order Strawberry_Latte(){
    
    
        Order order = new Order();
        order.add(new StrawberryCake());
        order.add(new Latte());
        return order;
    }
    
    //汤圆蛋糕配拿铁套餐
    public Order SoCake_Latte(){
    
    
        Order order = new Order();
        order.add(new Socake());
        order.add(new Latte());
        return order;
    }
}

//根据多种物料可以进行多种组合

最後に、テスト用のテストクラスを作成します

//测试类测试
public class BuilderPatternTest{
    
    

    public static void main(String[] args) {
    
    
        OrderBuilder orderBuilder = new OrderBuilder();
        Order Socake_Latte = orderBuilder.SoCake_Latte();
        Socake_Latte.print();
        System.out.println("Total Price:" + Socake_Latte.getTotal());
    }
}

//输出结果
//Item : Socake, Packing : Wrapper, Price : 35.0
//Item : Latte, Packing : Bottle, Price : 32.0
//Total Price:67.0

利点:

1.カプセル化が適切であるため、ビルダーモードを使用すると、クライアントは製品の構築プロセスやコンポーネントを知る必要がなくなります。これは、設計原則のDimitの法則に準拠しています。
2.ビルダーは拡張が簡単で、比較的独立しています。

概要:いわゆるビルダーモードは、Builderクラスを介して必要な複雑なオブジェクトを作成することです。これらの詳細は私たちによって隠されています。オブジェクトの内部作成が非常に複雑な場合は、ビルダーモードの使用を検討できます。逆に、比較的単純な場合は、ビルダーモードを使用する必要はありません。のデザインモードを強化しないでください。逆効果になる可能性のあるデザインモードのため。

おすすめ

転載: blog.csdn.net/MAKEJAVAMAN/article/details/115254189