简单工厂模式:定一个工厂类,可以根据不同的参数,返回不同的类的实例,这些类通常有共同的父类
优点:
高内聚,松耦合。使用工厂类时,只需要传入正确的参数,就可以获取需要的对象,无需知道其实现过程。
实现:
业务场景:例如我需要创建一个咖啡店,当客户需要某种咖啡并且店内可以提供的时候,我就为其提供一杯咖啡。这时候,这家咖啡店就可以当作一个咖啡工厂,生产出来的咖啡可以被当作产品,咖啡名称可以当作参数。工厂可以根据不同的参数,返回不同的产品,这就是简单工厂模式。
1、咖啡类(产品)
/**
* 咖啡类(父类)
*/
public abstract class Coffee {
/**
* 制作咖啡
*/
public abstract void makeCoffee();
}
/**
* 蓝山咖啡
*/
public class CoffeeLanshan extends Coffee{
public void makeCoffee(){
System.out.println("制作了一杯蓝山咖啡");
}
}
/**
* 猫屎咖啡
*/
public class CoffeeMaoShi extends Coffee{
public void makeCoffee(){
System.out.println("制作了一杯猫屎咖啡");
}
}
2、咖啡工厂类
/**
* 咖啡工厂类
*/
public class CoffeeFactory {
public static Coffee getCoffee(String name){
Coffee coffee = null;
switch (name){
case "蓝山咖啡":
coffee = new CoffeeLanshan();
break;
case "猫屎咖啡":
coffee = new CoffeeMaoShi();
break;
default:
System.out.println("抱歉,店内没有该咖啡");
break;
}
if (coffee != null){
coffee.makeCoffee();
}
return coffee;
}
}
3、测试
/**
* 简单工厂测试类
*/
public class TestSimpleFactory {
public static void main(String [] args){
Coffee coffeeLanshan = CoffeeFactory.getCoffee("蓝山咖啡");
Coffee coffeeMaoshi = CoffeeFactory.getCoffee("猫屎咖啡");
Coffee coffeeWuming = CoffeeFactory.getCoffee("无名咖啡");
}
}
测试结果:
同时,可优化工厂类,添加一个菜单,用户直接从菜单选择
/**
* 咖啡工厂类
*/
public class CoffeeFactory {
/**
* 菜单
*/
public static final class menu {
public static final String LAN_SHAN = "蓝山咖啡";
public static final String MAO_SHI = "猫屎咖啡";
}
public static Coffee getCoffee(String name){
Coffee coffee = null;
switch (name){
case menu.LAN_SHAN:
coffee = new CoffeeLanshan();
break;
case menu.MAO_SHI:
coffee = new CoffeeMaoShi();
break;
default:
System.out.println("抱歉,店内没有该咖啡");
break;
}
if (coffee != null){
coffee.makeCoffee();
}
return coffee;
}
}
/**
* 简单工厂测试类
*/
public class TestSimpleFactory {
public static void main(String [] args){
Coffee coffeeLanshan = CoffeeFactory.getCoffee(CoffeeFactory.menu.LAN_SHAN);
Coffee coffeeMaoshi = CoffeeFactory.getCoffee(CoffeeFactory.menu.MAO_SHI);
Coffee coffeeWuming = CoffeeFactory.getCoffee("无名咖啡");
}
}