工厂模式
创建对象的最佳方式,相当于把创建对象的过程进行了封装,这样可以将实例化对象的逻辑不对外共享,对外提供一个工厂类方便调用
工厂模式分为三种
-
普通工厂模式
//step1:创建接口 interface Fruit { public void product(); }
//step2:创建类实现接口 class Apple implements Fruit { @Override public void product() { System.out.println("开始生产苹果汁"); } } class Orange implements Fruit { @Override public void product() { System.out.println("开始生产橙汁"); } } class Banana implements Fruit { @Override public void product() { System.out.println("开始生产香蕉汁"); } }
//step3:创建工厂类,实现给定指定条件创建指定对象 public class FactoryBean { // 1.普通工厂模式 public Fruit getFruit(String type) { if (type.equals("Apple")) { // 创建对象的逻辑-----【封装】 return new Apple(); } else if (type.equals("Orange")) { // 创建对象的逻辑-----【封装】 return new Orange(); } else if (type.equals("Banana")) { // 创建对象的逻辑-----【封装】 return new Banana(); } else return null; }
//step4:使用工厂类,通过传递类型参数获取指定类的对象。 public class FactoryTest { public static void main(String[] args) { FactoryBean f = new FactoryBean(); Fruit fruit = f.getFruit("Orange"); Fruit fruit2 = f.getFruit("Apple"); Fruit fruit3 = f.getFruit("Banana"); fruit.product(); fruit2.product(); fruit3.product(); } }
运行效果:
-
多工厂模式
相当于普通工厂模式的提升,提供了多个方法实现不同对象的实例化过程。public class FactoryBean { // 2.多工厂模式 public Apple getApple() { return new Apple(); } public Orange getOrange() { return new Orange(); } public Banana getBanana() { return new Banana(); }
public class FactoryTest { public static void main(String[] args) { // 2.多工厂模式测试 FactoryBean f = new FactoryBean(); Apple apple = f.getApple(); Banana banana = f.getBanana(); Orange orange = f.getOrange(); apple.product(); banana.product(); orange.product(); } }
测试结果:
-
静态工厂模式
相当于多工厂模式的提升, 提供的多个方法通过static修饰 这样不用创建实例可以通过类名直接调用
public class FactoryBean { // 静态工厂模式(就是给方法加上static,这样就可以通过类名直接调用了) public static Apple getApple() { return new Apple(); } public static Orange getOrange() { return new Orange(); } public static Banana getBanana() { return new Banana(); } }
public class FactoryTest {
public static void main(String[] args) {
Apple apple = FactoryBean.getApple();
Banana banana = FactoryBean.getBanana();
Orange orange = FactoryBean.getOrange();
apple.product();
banana.product();
orange.product();
}
}