工厂模式
- 实例化对象不使用new,用工厂方法代替
- 将选择实现类,创建对象统一管理和控制
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方式使一个类的实例化延迟到子类。
开放-封闭原则
- 软件实体应该可以扩展,但是不可修改
- 在最初编写代码时,我们不能确定是否需要修改功能,当需要更改功能时我们就创建抽象来隔离以后发生的同类变化。
- 开放-封闭原则是面向对象的核心所在,主要用于提高程序的可维护性,可复用性,可扩展性。
Question
设计一个可扩展的计算器
在编写代码的时候我们可能不会思考得那么全面,将所有的功能完美无缺地写进一个类中,所以工厂模式的主要思想就是先建立一个抽象类和他的抽象方法,通过工厂接口来选择适当的子类,由子类来实现该抽象方法,从而得到不同的操作结果。
- 建立抽象(我们先建立一个抽象对象,以便后续子类添加功能)
Java代码
abstract class Operation{
private int number1=0;
private int number2=0;
public int getNumber1() {
return number1;
}
public void setNumber1(int number1) {
this.number1 = number1;
}
public int getNumber2() {
return number2;
}
public void setNumber2(int number2) {
this.number2 = number2;
}
abstract double getResult();
}
interface IFactory{
Operation createOperation();
}
- 实现类
//实现父类getResult方法 返回加法的结果
class AddOperation extends Operation{
@Override
double getResult() {
return getNumber1()+getNumber2();
}
}
//通过实现IFactory 工厂选择加法操作类
class AddFactory implements IFactory{
@Override
public Operation createOperation() {
return new AddOperation();
}
}
- 主类调用
class Main{
public static void main(String[] args){
IFactory factory = new AddFactory();//建立加法工厂
Operation add_op = factory.createOperation();//通过工厂选择需要的功能类
add_op.setNumber1(10);
add_op.setNumber2(12);
System.out.println(add_op.getResult());
}
}
那么现在我需要扩展一个减法功能就可以添加以下类
class SubOperation extends Operation{
@Override
double getResult() {
return getNumber1()-getNumber2();
}
}
class SubFactory implements IFactory{
@Override
public Operation createOperation() {
return new SubOperation();
}
}
主函数
class Main{
public static void main(String[] args){
IFactory factory = new SubFactory();//建立减法工厂
Operation sub_op = factory.createOperation();//通过工厂选择需要的功能类
sub_op.setNumber1(10);
sub_op.setNumber2(2);
System.out.println(sub_op.getResult());
}
}