简单工厂模式:定一个工厂类,可以根据不同的参数,返回不同的类的实例,这些类通常有共同的父类
优点:
高内聚,松耦合。使用工厂类时,只需要传入正确的参数,就可以获取需要的对象,无需知道其实现过程。
实现:
业务场景:例如我需要创建一个咖啡店,当客户需要某种咖啡并且店内可以提供的时候,我就为其提供一杯咖啡。这时候,这家咖啡店就可以当作一个咖啡工厂,生产出来的咖啡可以被当作产品,咖啡名称可以当作参数。工厂可以根据不同的参数,返回不同的产品,这就是简单工厂模式。
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("无名咖啡");}}
