1.案例1-计算器实现
接上文 简单方法模式例子:
https://blog.youkuaiyun.com/single_wolf_wolf/article/details/78702232
工厂方法模式结果图如下:

新增 公共工厂接口和每种操作的工厂类
//工厂方式模式-简单工厂进阶
public interface IFactory {
public Operation createOperation();
}
//加减乘除各自建立一个工厂类
public class AddFactory implements IFactory {
@Override
public Operation createOperation(){
return new OperationAdd();
}
}
public class SubFactory implements IFactory {
@Override
public Operation createOperation(){
return new OperationSub();
}
}
public class MulFactory implements IFactory {
@Override
public Operation createOperation(){
return new OperationMul();
}
}
public class DivFactory implements IFactory {
@Override
public Operation createOperation(){
return new OperationDiv();
}
}
测试一下:
public class ClientMainTest {
public static void main(String[] args){
IFactory iFactory = new AddFactory();
Operation operation = iFactory.createOperation();
operation.set_numberA(2);
operation.set_numberB(5);
System.out.println(operation.getResult());
}
}
/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=50111:/Applications/IntelliJ IDEA CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/tools.jar:/Users/liuxuwei/IdeaProjects/dahuadesignmodel/out/production/dahuadesignmodel factorymethodmodel5.ClientMainTest
7.0
Process finished with exit code 0
同样一个案例,简单工厂模式比工厂模式简单很多,那么,为什么还会有工厂模式呢?
原因如下:
简单工厂模式最大的优点是在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了产品的依赖。
工厂方法模式,定义了一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类。
如果我们给此方法增加一个功能,求X得Y次方,如果按照简单工厂模式,需要修改运算工厂类中的case分支,从而违背了开发-封闭原则,如果是工厂方法模式,我们只是需要增加该功能的运算类和运算工厂类就可以了,是扩展了变化,而不是修改了变化,符合开发-封闭原则。
但是就此案例来说,简单工厂模式,把内部逻辑判断放到了工厂类中进行,工厂方法模式,是放到了客户端进行,即在客户端进行选择具体使用哪个具体的运算。
2.例子2 《大话设计模式》中雷锋工厂
大学生,社区志愿者都可以是雷锋,以此建立了雷锋工厂
public class LeiFeng {
public void Sweep(){
System.out.println("扫地");
}
public void Wash(){
System.out.println("洗衣服");
}
public void BuyRice(){
System.out.println("买米");
}
}
public interface IFactory {
public LeiFeng createLeiFeng();
}
public class UnderGraduate extends LeiFeng{
}
public class UnderGraduateFactory implements IFactory {
@Override
public LeiFeng createLeiFeng(){
return new UnderGraduate();
}
}
public class Volunteer extends LeiFeng {
}
public class VolunteerFactory implements IFactory {
@Override
public LeiFeng createLeiFeng(){
return new Volunteer();
}
}
public class LeifengTestMain {
public static void main(String[] args){
IFactory factory = new UnderGraduateFactory();
LeiFeng student = factory.createLeiFeng();
student.BuyRice();
student.Sweep();
student.Wash();
IFactory factory2 = new VolunteerFactory();
LeiFeng volunteer = factory2.createLeiFeng();
volunteer.Wash();
volunteer.Sweep();
volunteer.BuyRice();
}
}
结果:
买米
扫地
洗衣服
洗衣服
扫地
买米
Process finished with exit code 0
参考《大话设计模式》
9610

被折叠的 条评论
为什么被折叠?



