**
使用反射动态获取咖啡种类,既遵循了迪米特原则,又遵循了开闭原则,完美解耦
**
接口Coffee
public interface Coffee {
void addSugar();
void addMilk();
}
各种咖啡品种
public class LatteCoffee implements Coffee{
@Override
public void addSugar() {
System.out.println("拿铁咖啡加糖...");
}
@Override
public void addMilk() {
System.out.println("拿铁咖啡加奶...");
}
}
public class AmericanCoffee implements Coffee{
@Override
public void addSugar() {
System.out.println("美式咖啡加糖...");
}
@Override
public void addMilk() {
System.out.println("美式咖啡加奶...");
}
}
public class VienneseCoffee implements Coffee{
@Override
public void addSugar() {
System.out.println("Viennese加糖...");
}
@Override
public void addMilk() {
System.out.println("Viennese加奶...");
}
}
咖啡工厂
public class CoffeeFactory {
public static Coffee createCoffee(String type){
try {
Class<?> cls = Class.forName("com.lqy.pattern.factory."
+ type.substring(0, 1).toUpperCase()
+ type.substring(1).toLowerCase() + "Coffee");
Constructor<?> declaredConstructor = cls.getDeclaredConstructor();
Coffee coffee = (Coffee)declaredConstructor.newInstance();
return coffee;
} catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
咖啡店
public class CoffeeStore {
public Coffee orderCoffee(String type) {
Coffee coffee = CoffeeFactory.createCoffee(type);
if(coffee != null) {
coffee.addSugar();
coffee.addMilk();
return coffee;
}
return null;
}
}
测试类
public class TestCoffee {
public static void main(String[] args) {
CoffeeStore coffeeStore = new CoffeeStore();
Coffee coffee = coffeeStore.orderCoffee("viennese");
System.out.println(coffee);
}
}