面对可能的变化,通过创建工厂来创建不同的对象来实现很多功能的切换,不用在业务代码中切换。
1
接口:
public interface Output {
public void print();
}
两个实现类
public class OutputImpl implements Output{
@Override
public void print() {
System.out.println("OutputImpl->print");
}
}
public class BetterOutputImpl implements Output {
@Override
public void print() {
System.out.println("BetterOutputImpl-->Output");
}
}
对象工厂创建指定类型的对对象来切换不同的功能:
public class SimpleFactory {
public static Output getOutputInstance(String type) {
if ("BetterOutputImpl".equals(type)) {
return new BetterOutputImpl();
} else {
return new OutputImpl();
}
}
}
测试
public class TextMain {
private Output output;
public TextMain(Output output) {
this.output = output;
}
public void print(){
output.print();
}
public static void main(String[] args) {
Output output=SimpleFactory.getOutputInstance("BetterOutputImpl");
TextMain textMain=new TextMain(output);
textMain.print();
}
}
通过简单工厂模式,通过实现接口,创建一个工厂类中的对应的方法,返回不同接口的实现类的对象,调用处接口引用指向不同的实现类的对象,从而实现调用者和对象创建过程的分离,实现解耦,而使用接口的意义在于,当系统重构时,因为均继承一个接口,产生的对象均可被指向。
参考:李刚《疯狂java讲义》第三版。
2 参考《大话设计模式》。在一的基础上引入的抽象类,对于抽象与接口的理解又更深了。
整体架构图:
接口:
public interface Operation {
public Integer getResult();
}
抽象类:
public abstract class AbstractOperation implements Operation{
public Integer numberA=0;
public Integer numberB=0;
public abstract Integer getResult();
//省略get set方法
}
四个实现类:
public class OperationAdd extends AbstractOperation{
public Integer getResult(){
return numberA+numberB;
}
}
public class OperationDiv extends AbstractOperation {
@Override
public Integer getResult() {
// TODO Auto-generated method stub
return numberA/numberB;
}
}
public class OperationMul extends AbstractOperation {
@Override
public Integer getResult() {
// TODO Auto-generated method stub
return numberA*numberB;
}
}
public class OperationSub extends AbstractOperation {
@Override
public Integer getResult() {
// TODO Auto-generated method stub
return numberA-numberB;
}
}
测试:
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractOperation operation=OperationFactory.createOperation("+");
operation.setNumberA(1);
operation.setNumberB(2);
System.out.println(operation.getResult());
}