Spring设计模式_工厂模式
先说下工厂模式的特性
1.对于调用者来说,影藏了复杂的逻辑处理过程,调用者只关心执行结果。
2.工厂要对结果负责,保证生产出符合规范的产品。
Git代码地址 https://github.com/wujiachengSH/WjcFactoryDemo
下述的3个栗子分别为简单工厂,工厂方法,抽象工厂
先来个栗子看看什么是工厂把
首先是简单工厂模式
声明一个动物工厂
package com.wjc.Factory;
public interface Animal {
String eat();
String dirnk();
String run();
}
来2个实现类
package com.wjc.Factory;
public class Elephant implements Animal {
@Override
public String eat() {
// TODO Auto-generated method stub
return "Elephant e";
}
@Override
public String dirnk() {
// TODO Auto-generated method stub
return "Elephant d";
}
@Override
public String run() {
// TODO Auto-generated method stub
return "Elephant r";
}
}
package com.wjc.Factory;
public class Leopard implements Animal {
@Override
public String eat() {
// TODO Auto-generated method stub
return "Leopard e";
}
@Override
public String dirnk() {
// TODO Auto-generated method stub
return "Leopard d";
}
@Override
public String run() {
// TODO Auto-generated method stub
return "Leopard r";
}
}
然后我们来定义一个工厂
package com.wjc.Factory.simple; import com.wjc.Factory.Animal;
import com.wjc.Factory.Elephant;
import com.wjc.Factory.Leopard; public class SimpleFactory { public Animal getAnimal(String name) {
if ("Elephant".equals(name)) {
return new Elephant();
}else if ("Leopard".equals(name)) {
return new Leopard();
}else {
return null;
}
} }
测试一下这段代码
package com.wjc.Factory.simple;
import com.wjc.Factory.Animal;
public class Test {
public static void main(String[] args) {
SimpleFactory simpleFactory = new SimpleFactory();
Animal animal = simpleFactory.getAnimal("Leopard");
System.out.println(animal.eat());
}
}
可以看到工厂模式的意义在于,当需要使用对象的时候,不再通过New对象的方式拿取对象实例,而是通过工厂来获取对象
通过工厂来声明Bean最大的好处就在于
可以在Bean工厂中控制Bean是单例的?原型模式的?被代理的等等等。
不过上述简单工厂能力过于强大,一个工厂竟然可以生产多种动物,显然不符合原理。我们来看正宗的工厂
工厂模式代码
1.声明一个工厂接口
package com.wjc.Factory.func;
import com.wjc.Factory.Animal;
public interface Factory {
Animal getAnimal();
}
2.分别实现工厂接口
package com.wjc.Factory.func; import com.wjc.Factory.Animal;
import com.wjc.Factory.Elephant; public class ElephantFactory implements Factory { @Override
public Animal getAnimal() {
// TODO Auto-generated method stub
return new Elephant();
} }
package com.wjc.Factory.func; import com.wjc.Factory.Animal;
import com.wjc.Factory.Leopard; public class LeopardFactory implements Factory { //来个单例工厂好了
private static class LeopardBean {
private static final Leopard INSTANCE = new Leopard();
} @Override
public Animal getAnimal() {
// TODO Auto-generated method stub
return LeopardBean.INSTANCE;
} }
3.通过工厂生成Bean
package com.wjc.Factory.func;
public class Test {
public static void main(String[] args) {
ElephantFactory elephantFactory = new ElephantFactory();
System.out.println(elephantFactory.getAnimal().eat());
LeopardFactory leopardFactory = new LeopardFactory();
System.out.println(leopardFactory.getAnimal().eat());
}
}
可以看到标准的Bean工厂,可以在工厂中声明和配置Bean对象的实现特性,甚至可以把上一篇代理模式使用进去。
https://www.cnblogs.com/wujc/p/10554933.html
但是上述代码还是存在着一个问题,工厂很多的情况下,获取实例其实并不方便,我们再进行进一步的封装,来靠近IOC
我们来定义一个默认工厂,调用刚才封装的几个工厂
先写一个抽象方法
package com.wjc.Factory.abstra; import com.wjc.Factory.Animal;
import com.wjc.Factory.func.ElephantFactory;
import com.wjc.Factory.func.LeopardFactory; public abstract class AbstarctFactory { protected abstract Animal getAnimal(); public Animal getAnimal(String name) {
if ("Elephant".equals(name)) {
return new ElephantFactory().getAnimal();
}else if ("Leopard".equals(name)) {
return new LeopardFactory().getAnimal();
}else {
return null;
}
} }
来个实现方法,其中有一个默认的产生对象
package com.wjc.Factory.abstra; import com.wjc.Factory.Animal;
import com.wjc.Factory.func.LeopardFactory; public class Factory extends AbstarctFactory { private LeopardFactory defaultFactory = new LeopardFactory(); @Override
protected Animal getAnimal() {
// TODO Auto-generated method stub
return defaultFactory.getAnimal();
} }
测试一下性能
package com.wjc.Factory.abstra;
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
System.out.println(factory.getAnimal("Elephant").eat());
}
}
上述改造后的代码就是抽象工厂模式了
小结一下工厂模式,特性是封装了创建Bean的过程。
Spring设计模式_工厂模式的更多相关文章
- spring设计模式_代理模式
代理模式应该是Spring核心设计模式之一了 先说下代理模式特性: 1.有代理人和被代理人 2.对于被代理的人来说,这件事情是一定要做的,但是我又不想做,所有就找代理人来做. 3.需要获取到被代理人的 ...
- java设计模式_工厂模式
关于设计模式 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结,是一种设计思维,使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证 ...
- .Net设计模式_工厂模式(3)
3.抽象工厂模式 引言: 我们知道汽车需要很多部件才能组装成一辆成品的车,那么我们需要汽车厂生产很多东西,如:马达.车轴.轮胎等,这些东西组装起来后成为了一辆车. 这些东西就是产品族,图解:(出之ht ...
- .Net设计模式_工厂模式(1)
工厂模式有三个模式: 简单工厂(Simple Factory)模式 工厂方法(Factory Method)模式 抽象工厂(Abstract Factory)模式 1.简单工厂 引言: 我是消费者,我 ...
- java_设计模式_工厂模式_Factory Pattern(2016-08-04)
工厂模式主要是为创建对象提供了接口.工厂模式按照<Java与模式>中的提法分为三类: (1)简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory ...
- PHP设计模式_工厂模式
个人理解工厂类相当于平时用的基类,只需要把类new一次然后付给一个变量,以后直接引入基类调用变量使用类里的方法即可 了解 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new. 使用工厂模式,可 ...
- Spring设计模式_策略模式/其他
策略模式特性 1.执行最终结果一样 2.执行过程和执行逻辑不一样 3.使用同一接口 达到目的就可以了 Git地址 https://github.com/wujiachengSH/WjcStrategy ...
- .Net设计模式_工厂模式(2)
2.工厂方法模式 引言: 上一篇中我们描述了简单工厂的缺点,而解决方法就是把工厂接口化,把工厂的行为标准化,这就是工厂方法模式. 理解: 工厂能制造A和B鞋,如果消费者现在要求制造C鞋.D鞋...咋办 ...
- Spring 实现两种设计模式:工厂模式和单态模式(单例模式)
本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...
随机推荐
- 开发自己的react-native组件并发布到npm[转]
原文链接:https://www.jianshu.com/p/091a68ea1ca7 写在前面 在做react-native开发的时候,我们经常会找到一些第三方组件,并且通过npm install的 ...
- 各种输出速度比较(小白应该来看看,dalao绕道)
其实这个是修改之后测试的速度,因为之前测量方式有一点问题,经过@复杂的哈皮狗 的正确提醒后更正了一下 之前我一直以为各种输出速度比较是putchar>printf>cout; 但事实上并不 ...
- 作用域链和函数内部this指向问题以及bind、call、apply方法
作用域链和函数内部this指向问题以及bind.call.apply方法 作用域链 作用域是相对于变量而言的, 其意义就在与查找变量(确定变量的来处, 变量是否可以访问到, 确定变量在当前位置是否可以 ...
- Amazon新一代云端关系数据库Aurora
在2017年5月芝加哥举办的世界顶级数据库会议SIGMOD/PODS上,作为全球最大的公有云服务提供商,Amazon首次系统的总结了新一代云端关系数据库Aurora的设计实现.Aurora是Amazo ...
- 相机标定问题-Matlab & Py-Opencv
一.相机标定基本理论 1.相机成像系统介绍 图中总共有4个坐标系: 图像坐标系:Op 坐标表示方法(u,v) Unit:Dots(个) 成像坐标系:Oi ...
- 2018年多校第三场第一题 A. Ascending Rating hdu6319
比赛地址:http://acm.hdu.edu.cn/contests/contest_show.php?cid=804 题目编号:第一题 A. Ascending Rating hdu6319 题 ...
- MySQL 栏位修改为区分大小写
) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL; ) BINARY CHARACTER SET utf8 COLLATE utf8_ ...
- <玩转Django2.0>读书笔记:邮件和分页
1. 发送邮件 # settings.py设置 # 邮箱设置 EMAIL_USE_SSL = True # 邮件服务器 EMAIL_HOST = 'smtp.qq.com' # 邮件服务端口 EMAI ...
- angularjs和jquery前端发送以http请求formdata数据
formdata是比较常见的前端发送给后端的请求,不仅可以上传数据,而且同时可以上传文件. jquery使用http请求上传formdata数据的方法: var formdata = new Form ...
- 使用anaconda创建tensorflow环境后如何在jupyter notebook中使用
在以下目录中 C:\Users\UserName\AppData\Roaming\jupyter\kernels\python3 打开kernel.json文件,将python.exe文件的路径修改至 ...