工厂是一种创建型的设计模式,常用于封装变化,一般遵循那里有变化就封装那里的原则。
简单工厂模式又 叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
创建对象实例时,不要直接 new 类, 而是把这个 new 类的动作放在一个工厂的方法中,并返回。
不要让类继承具体类,而是继承抽象类或者是实现 interface(接口)
不要覆盖基类中已经实现的方法。
以一个java面试题为例 --> 使用java实现一个计算机+-*/,得到结果。
常规写法:
package com.ytkj.design.model.factory.calculate; /** * 以一个java面试题为例 --> 使用java实现一个计算机加减乘除得到结果 */ public class Computer { private String calculate;//计算符号 public String getCalculate() { return calculate; } public void setCalculate(String calculate) { this.calculate = calculate; } public int getResult(int a, int b) { if ("+".equals(calculate)) { return a + b; } else if ("-".equals(calculate)) { return a - b; } else if ("*".equals(calculate)) { return a * b; } else { return a / b; } } } class Test { public static void main(String[] args) { Computer computer = new Computer(); computer.setCalculate("-"); int result = computer.getResult(10, 20); System.out.println(result); } } /* 上面的写法实现虽然简单,但是却没有面向对象的特性,代码拓展性差。 (工厂模式一般遵循那里有变化就封装那里的原则),在面向对象编程语言中,一切都是对象,所以上面 运算符号(既然这里有变化那么我们就进行封装) 也应当作对象来处理。 */
改进:
public interface Operation { int getResult(int a,int b); }
public class Add implements Operation { @Override public int getResult(int a, int b) { return a+b; } }
public class Subtraction implements Operation { @Override public int getResult(int a, int b) { return a-b; } }
public class Multiplication implements Operation { @Override public int getResult(int a, int b) { return a*b; } }
public class Division implements Operation { @Override public int getResult(int a, int b) { return a/b; } }
package com.ytkj.design.model.factory.calculate.improve; /** * 使用简单工厂模式实现根据不同的情况创建不同的对象。 */ public class SimpleFactory { public static Operation getOperation(String operation) { switch (operation) { case "+": return new Add(); case "-": return new Subtraction(); case "*": return new Multiplication(); default: return new Division(); } } } class Test{ public static void main(String[] args) { Operation operation = SimpleFactory.getOperation("+"); int result = operation.getResult(6, 2); System.out.println(result); } }