大话设计模式之工厂模式
工厂模式可以分为3类:简单工厂模式、工厂模式、抽象工厂模式
一:简单工厂模式(又叫静态工厂模式)
是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
现在围绕书中的一个运算实例来展开探索(用面向对象的思想来实现一个简单的加减运算)
先创建一个操作基类
/** * @Author: * @Description:封装 * 对numA、numB进行加减运算 * @Date: created in 2018/7/18 * @Modified By: */ public class Operation { public double numA; public double numB; public double getNumA() { return numA; } public void setNumA(double numA) { this.numA = numA; } public double getNumB() { return numB; } public void setNumB(double numB) { this.numB = numB; } /** * 操作数字返回结果 * @return */ public double result(){ return numA+numB; } }
然后再创建两个加减类继承上述基类重写result结果
/** * @Author: * @Description: 加 * @Date: created in 2018/7/18 * @Modified By: */ public class OperatorAdd extends Operation { public double result(){ return numA+numB; } }
/** * @Author: * @Description: 减 * @Date: created in 2018/7/18 * @Modified By: */ public class OperatorSub extends Operation { public double result(){ return numA-numB; } }
接下来我们可以根据不同运算方法创建不同类(通过静态工厂创建)
/** * @Author: * @Description: * @Date: created in 2018/7/18 * @Modified By: */ public class OperationFactory { public static Operation createOperation(String operation){ Operation oper = null; switch (operation){ case "+": oper = new OperatorAdd(); break; case "-": oper = new OperatorSub(); break; } return oper; } }
最后通过实例调用它
/** * @Author: * @Description: * @Date: created in 2018/7/18 * @Modified By: */ public class MainTest { public static void main(String[] args){ // Operation operation = OperationFactory.createOperation("+"); Operation operation = OperationFactory.createOperation("-"); operation.setNumA(5); operation.setNumB(5); System.out.println(operation.result()); } }
简单工厂将对象的创建过程进行了封装,用户不需要知道具体的创建过程,只需要调用工厂类获取对象即可。
这种简单工厂的写法是通过switch-case来判断对象创建过程的。在实际使用过程中,违背了 开放-关闭原则,当然有些情况下可以通过反射调用来弥补这种不足。
二:工厂方法
工厂方法在简单工厂的基础上再包了一层工厂,所有的工厂都是此工厂的子类。而产生对象的类型由子类工厂决定。
定义父级工厂接口
/** * @Author: * @Description:用于创建操作对象 * @Date: created in 2018/7/18 * @Modified By: */ public interface IFactory { Operation creOperation(); }
创建加法运算子工厂
/** * @Author: * @Description: * @Date: created in 2018/7/18 * @Modified By: */ public class OperationAddFactory implements IFactory { @Override public Operation creOperation() { return new OperatorAdd(); } }
创建减法运算子工厂
/** * @Author: * @Description: * @Date: created in 2018/7/18 * @Modified By: */ public class OperationSubFactory implements IFactory { @Override public Operation creOperation() { return new OperatorSub(); } }
main方法测试实例
/** * @Author: * @Description: * @Date: created in 2018/7/18 * @Modified By: */ public class MainTest { public static void main(String[] args){ // IFactory factory = new OperationAddFactory(); IFactory factory = new OperationSubFactory(); Operation operation = factory.creOperation(); operation.setNumA(5); operation.setNumB(5); System.out.println(operation.result()); } }
工厂方法将类的实例化推迟到了其子类。所以使用工厂方法模式时,需要客户端决定实例化哪一个工厂类。
三:抽象工厂
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
实现
我们将创建 Animal 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 AnimalFactory 和 ColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。
//创建animal、color接口
/** * @Author: * @Description: 动物 * @Date: created in 2018/7/19 * @Modified By: */ public interface Animal { void descript(); } /** * @Author: * @Description: 颜色 * @Date: created in 2018/7/19 * @Modified By: */ public interface Color { void fill(); }
//animal实现类 public class Dog implements Animal { @Override public void descript() { System.out.println("I am dog"); } } public class Cat implements Animal { @Override public void descript() { System.out.println("I am cat"); } } //color实现类 public class Red implements Color { @Override public void fill() { System.out.println("I am red"); } } public class Green implements Color { @Override public void fill() { System.out.println("I am green"); } } //为 Color 和 Animal对象创建抽象类来获取工厂。 public abstract class AbstractFactory { public abstract Animal getAnimal(String animal); public abstract Color getColor(String color); } //创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象 public class AnimalFactory extends AbstractFactory { @Override public Animal getAnimal(String animal) { switch (animal){ case "cat": return new Cat(); case "dog": return new Dog(); } return null; } @Override public Color getColor(String color) { return null; } } public class ColorFactory extends AbstractFactory { @Override public Animal getAnimal(String animal) { return null; } @Override public Color getColor(String color) { switch (color){ case "red": return new Red(); case "green": return new Green(); } return null; } } //创建一个工厂生成器类,通过动物信息或颜色信息来获取工厂。 public class FactoryProducer { public static AbstractFactory getFactory(String choice){ if(choice.equalsIgnoreCase("Animal")){ return new AnimalFactory(); }else if(choice.equalsIgnoreCase("Color")){ return new ColorFactory(); } return null; } } //main方法测试 public class MainTest { public static void main(String[] args){ //获取动物工厂 AbstractFactory abstractFactory = FactoryProducer.getFactory("animal"); Animal animal = abstractFactory.getAnimal("cat"); Animal animal2 = abstractFactory.getAnimal("dog"); animal.descript(); animal2.descript(); //获取颜色工厂 AbstractFactory abstractFactory2 = FactoryProducer.getFactory("color"); Color color = abstractFactory2.getColor("red"); Color color2 = abstractFactory2.getColor("green"); color.fill(); color2.fill(); } } //输出结果 I am cat I am dog I am red I am green