工厂模式
- 将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目依赖关系的解耦,从而提高项目的扩展和维护性。
- 创建对象实例时,不去直接new,而是把这个new类的动作放到一个工厂方法中。
- 不让类继承具体类,而是继承抽象类或者是实现接口。
- 不要覆盖基类中已经实现的方法。
简单工厂模式
简单工厂模式属于创建型模式,是工厂模式的一种。是工厂模式家族中最简单实用的模式。
简单工厂模式:定义一个创建对象的类,由这个类来封装实例化对象的行为。
写一个计算器的例子:
//定义一个操作基类
public abstract class Operation {
private double number_a;
private double number_b;
public abstract double getResult();
// 省略getter setter方法...
}
//加法运算类
public class OperationAdd extends Operation{
@Override
public double getResult() {
return getNumber_a()+getNumber_b();
}
}
//减法运算类
public class OperationSub extends Operation{
@Override
public double getResult() {
return getNumber_a()-getNumber_b();
}
}
//静态工厂类
public class Operationfactory {
public static Operation createOperate(String operate){
Operation oper = null;
if(operate == "+"){
oper = new OperationAdd();
}else if(operate == "-"){
oper = new OperationSub();
}
return oper;
}
}
//计算测试
public class SimpleFactory {
public static void main(String[] args) {
Operation oper;
oper = Operationfactory.createOperate("+");
oper.setNumber_a(5.5);
oper.setNumber_b(3.4);
double result = oper.getResult();
System.out.println(result); //8.9
}
}
工厂方法模式
工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
将上面的代码进行改进,就是不要那个Operationfactory
静态工厂类了。
//定义一个操作基类
public abstract class Operation {
private double number_a;
private double number_b;
public abstract double getResult();
// 省略getter setter方法...
}
//加法运算类
public class OperationAdd extends Operation{
@Override
public double getResult() {
return getNumber_a()+getNumber_b();
}
}
//定义一个创建操作符的接口
public interface FactoryFunction {
Operation createOperation();
}
//加法操作符工厂实现这个接口 在这个工厂里返回对象
public class AddFactory implements FactoryFunction{
@Override
public Operation createOperation() {
return new OperationAdd();
}
}
public static void main(String[] args) {
//获取操作符的时候用加法工厂获取对象
FactoryFunction factory = new AddFactory();
Operation oper = factory.createOperation();
oper.setNumber_a(5.5);
oper.setNumber_b(3.4);
double result = oper.getResult();
System.out.println(result); //8.9
}
抽象工厂模式
抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
从设计层面看,抽象工厂模式就是对简单工厂模式的改进,或者说是进一步的抽象。将工厂抽象成两层,分为抽象工厂和具体实现的子类工厂。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。