設計模式開閉原則--java

靜態工廠模式 + 反射控制入參範圍

public interface IPrinter {
    void print();
}

public class CanonPrinter implements IPrinter {
    @Override
    public void print() {
        System.out.println("佳能打印機打印...");
    }
}

public class HPPrinter implements IPrinter {

    @Override
    public void print(){
        System.out.println("HP 打印機打印...");
    }
}

public class PrinterFactory {

    public static IPrinter createPrinter(Class<? extends IPrinter> clazz) throws IllegalAccessException, InstantiationException{
        return clazz.newInstance();
    }

    public static void main(String [] args) throws IllegalAccessException, InstantiationException{
        IPrinter canonPrinter = PrinterFactory.createPrinter(CanonPrinter.class);
        canonPrinter.print();
    }
}

當構造方法參數不少的時候 推薦使用 builder 模式 , 內部類.build() 返回外部對象

package com.ghc.hbase.api.patterns;

import sun.awt.image.BufferedImageDevice;

/**
 * @author :Frank Li
 * @date :Created in 2019/6/21 14:54
 * @description:${description}
 * @modified By:
 * @version: $version$
 */
public class NutritionFacts {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    public static class Builder{
        // Required parameters
        private final int servingSize;
        private final int servings;

        // Optional parameters - initialized to default values
        private int calories      = 0;
        private int fat           = 0;
        private int sodium        = 0;
        private int carbohydrate  = 0;

        public Builder(int servingSize, int servings){
            this.servings = servings;
            this.servingSize = servingSize;
        }

        public Builder calories(int val){
            this.calories = val;
            return this;
        }
        public Builder fat(int val){
            this.fat = val;
            return this;
        }
        public Builder sodium(int val){
            this.sodium = val;
            return this;
        }
        public Builder carbohydrate(int val){
            this.carbohydrate = val;
            return this;
        }
        public NutritionFacts build(){
            return new NutritionFacts(this);
        }
    }
    NutritionFacts(Builder builder){
        this.servings = builder.servings;
        this.servingSize = builder.servingSize;
        this.calories = builder.calories;
        this.fat = builder.fat;
        this.sodium = builder.sodium;
        this.carbohydrate = builder.carbohydrate;
    }

    public static void main(String [] args){
        NutritionFacts nutritionFacts = new NutritionFacts.Builder(240,8)
                .calories(100)
                .fat(5)
                .sodium(35)
                .carbohydrate(27)
                .build();
    }
}
相關文章
相關標籤/搜索