1、学习总结:
(1)工厂模式优点:
a、将业务逻辑和界面逻辑分离,降低两者之间的耦合性。
b、将具体的不同业务进行分离,实现业务间的松耦合。
c、用一个单独的类来决定创建哪个业务实例的过程。这就是工厂。究竟要实例化哪个业务类,将来会不会增加实例化的对象,这些都是容易变化的地方,所以适合用一个工厂来做决策。
其实,c的内容才是工厂模式的原理,但是c的实现,需要a和b已经实现的情况下才可以使用。
(2)通过工厂模式实现一个具体功能时:
如果可以用工厂来实例化的某个业务需要更改,可以直接更改对应类自己内部的内容即可,其它类不会涉及任何更改;
如果需要增加某个可以通过工厂来实例化的业务,则需要做两处修改:
a、写一个新类,只涉及自己的业务逻辑功能。
b、在工厂类里面,增加实例化这个类的代码。
2、手动模拟书上的案例:实现一个计算器,可以完成加减乘除运算。
包括的7个类:
client类:客户端代码
Operation类:定义操作数和获取操作结果的虚方法。
OperationAdd类:加操作,继承自Operation
OperationSubs类:减操作,继承自Operation
OperationMul类:乘操作,继承自Operation
OperationDevide 类:除操作,继承自Operation
OperationFactory类:工厂类,用于实例化一个具体的操作类。
(1)Client
package designmodel.firstchapter;
/**
* @Author: cxh
* @CreateTime: 17/12/31 17:53
* @ProjectName: JavaBaseTest
*/
public class Client {
//客户端代码
public static void main(String[] args) {
//定义一种操作
Operation ope=OperationFactory.createOperation("+");
//定义两个操作数
ope.setFirst(11);
ope.setSecond(22);
//输出计算结果
System.out.println(ope.getResult());
}
}
package designmodel.firstchapter;
/**
* @Author: cxh
* @CreateTime: 17/12/31 17:51
* @ProjectName: JavaBaseTest
*/
public class Operation {
private int first;
private int second;
//get and set
public int getFirst() {
return first;
}
public void setFirst(int first) {
this.first = first;
}
public int getSecond() {
return second;
}
public void setSecond(int second) {
this.second = second;
}
//求运算结果
public int getResult(){
return 0;
}
}
(3)OperationAdd
package designmodel.firstchapter;
/**
* @Author: cxh
* @CreateTime: 17/12/31 17:57
* @ProjectName: JavaBaseTest
*/
public class OperationAdd extends Operation {
@Override
public int getResult(){
return super.getFirst()+super.getSecond();
}
@Override
public void setFirst(int first) {
super.setFirst(first);
}
@Override
public void setSecond(int second) {
super.setSecond(second);
}
}
(4)OperationSubs
package designmodel.firstchapter;
/**
* @Author: cxh
* @CreateTime: 17/12/31 18:04
* @ProjectName: JavaBaseTest
*/
public class OperationSubs extends Operation {
@Override
public int getResult() {
return super.getFirst()-super.getSecond();
}
@Override
public void setFirst(int first) {
super.setFirst(first);
}
@Override
public void setSecond(int second) {
super.setSecond(second);
}
}
(5)OperationMul
package designmodel.firstchapter;
/**
* @Author: cxh
* @CreateTime: 17/12/31 18:16
* @ProjectName: JavaBaseTest
*/
public class OperationMul extends Operation {
@Override
public int getResult() {
return super.getFirst()*super.getSecond();
}
@Override
public void setFirst(int first) {
super.setFirst(first);
}
@Override
public void setSecond(int second) {
super.setSecond(second);
}
}
(6)OperationDevide
package designmodel.firstchapter;
/**
* @Author: cxh
* @CreateTime: 17/12/31 18:28
* @ProjectName: JavaBaseTest
*/
public class OperationDevide extends Operation {
@Override
public int getResult() {
try{
return super.getFirst()/super.getSecond();
}catch (Exception e){
System.out.println("错误信息列表:"+e);
return -1;
}
}
@Override
public void setFirst(int first) {
super.setFirst(first);
}
@Override
public void setSecond(int second) {
super.setSecond(second);
}
}
(7)OperationFactory
package designmodel.firstchapter;
/**
* @Author: cxh
* @CreateTime: 17/12/31 17:50
* @ProjectName: JavaBaseTest
*/
public class OperationFactory {
public static Operation createOperation(String s){
switch (s){
case "+":
return new OperationAdd();
case "-":
return new OperationSubs();
case "*":
return new OperationMul();
case "/":
return new OperationDevide();
}
return null;
}
}
输出结果:33