先说下工厂模式的特性

  1.对于调用者来说,影藏了复杂的逻辑处理过程,调用者只关心执行结果。

  2.工厂要对结果负责,保证生产出符合规范的产品。

Git代码地址  https://github.com/wujiachengSH/WjcFactoryDemo

下述的3个栗子分别为简单工厂,工厂方法,抽象工厂

先来个栗子看看什么是工厂把

首先是简单工厂模式

声明一个动物工厂

  1. package com.wjc.Factory;
  2.  
  3. public interface Animal {
  4.  
  5. String eat();
  6.  
  7. String dirnk();
  8.  
  9. String run();
  10.  
  11. }

来2个实现类

  1. package com.wjc.Factory;
  2.  
  3. public class Elephant implements Animal {
  4.  
  5. @Override
  6. public String eat() {
  7. // TODO Auto-generated method stub
  8. return "Elephant e";
  9. }
  10.  
  11. @Override
  12. public String dirnk() {
  13. // TODO Auto-generated method stub
  14. return "Elephant d";
  15. }
  16.  
  17. @Override
  18. public String run() {
  19. // TODO Auto-generated method stub
  20. return "Elephant r";
  21. }
  22.  
  23. }
  1. package com.wjc.Factory;
  2.  
  3. public class Leopard implements Animal {
  4.  
  5. @Override
  6. public String eat() {
  7. // TODO Auto-generated method stub
  8. return "Leopard e";
  9. }
  10.  
  11. @Override
  12. public String dirnk() {
  13. // TODO Auto-generated method stub
  14. return "Leopard d";
  15. }
  16.  
  17. @Override
  18. public String run() {
  19. // TODO Auto-generated method stub
  20. return "Leopard r";
  21. }
  22.  
  23. }

然后我们来定义一个工厂

  1. package com.wjc.Factory.simple;
  2.  
  3. import com.wjc.Factory.Animal;
  4. import com.wjc.Factory.Elephant;
  5. import com.wjc.Factory.Leopard;
  6.  
  7. public class SimpleFactory {
  8.  
  9. public Animal getAnimal(String name) {
  10. if ("Elephant".equals(name)) {
  11. return new Elephant();
  12. }else if ("Leopard".equals(name)) {
  13. return new Leopard();
  14. }else {
  15. return null;
  16. }
  17. }
  18.  
  19. }

测试一下这段代码

  1. package com.wjc.Factory.simple;
  2.  
  3. import com.wjc.Factory.Animal;
  4.  
  5. public class Test {
  6.  
  7. public static void main(String[] args) {
  8. SimpleFactory simpleFactory = new SimpleFactory();
  9. Animal animal = simpleFactory.getAnimal("Leopard");
  10. System.out.println(animal.eat());
  11.  
  12. }
  13. }

可以看到工厂模式的意义在于,当需要使用对象的时候,不再通过New对象的方式拿取对象实例,而是通过工厂来获取对象

通过工厂来声明Bean最大的好处就在于

可以在Bean工厂中控制Bean是单例的?原型模式的?被代理的等等等。

不过上述简单工厂能力过于强大,一个工厂竟然可以生产多种动物,显然不符合原理。我们来看正宗的工厂

工厂模式代码

1.声明一个工厂接口

  1. package com.wjc.Factory.func;
  2.  
  3. import com.wjc.Factory.Animal;
  4.  
  5. public interface Factory {
  6.  
  7. Animal getAnimal();
  8.  
  9. }

2.分别实现工厂接口

  1. package com.wjc.Factory.func;
  2.  
  3. import com.wjc.Factory.Animal;
  4. import com.wjc.Factory.Elephant;
  5.  
  6. public class ElephantFactory implements Factory {
  7.  
  8. @Override
  9. public Animal getAnimal() {
  10. // TODO Auto-generated method stub
  11. return new Elephant();
  12. }
  13.  
  14. }
  1. package com.wjc.Factory.func;
  2.  
  3. import com.wjc.Factory.Animal;
  4. import com.wjc.Factory.Leopard;
  5.  
  6. public class LeopardFactory implements Factory {
  7.  
  8. //来个单例工厂好了
  9. private static class LeopardBean {
  10. private static final Leopard INSTANCE = new Leopard();
  11. }
  12.  
  13. @Override
  14. public Animal getAnimal() {
  15. // TODO Auto-generated method stub
  16. return LeopardBean.INSTANCE;
  17. }
  18.  
  19. }

3.通过工厂生成Bean

  1. package com.wjc.Factory.func;
  2.  
  3. public class Test {
  4.  
  5. public static void main(String[] args) {
  6. ElephantFactory elephantFactory = new ElephantFactory();
  7. System.out.println(elephantFactory.getAnimal().eat());
  8.  
  9. LeopardFactory leopardFactory = new LeopardFactory();
  10. System.out.println(leopardFactory.getAnimal().eat());
  11.  
  12. }
  13.  
  14. }

可以看到标准的Bean工厂,可以在工厂中声明和配置Bean对象的实现特性,甚至可以把上一篇代理模式使用进去。

https://www.cnblogs.com/wujc/p/10554933.html

但是上述代码还是存在着一个问题,工厂很多的情况下,获取实例其实并不方便,我们再进行进一步的封装,来靠近IOC

我们来定义一个默认工厂,调用刚才封装的几个工厂

先写一个抽象方法

  1. package com.wjc.Factory.abstra;
  2.  
  3. import com.wjc.Factory.Animal;
  4. import com.wjc.Factory.func.ElephantFactory;
  5. import com.wjc.Factory.func.LeopardFactory;
  6.  
  7. public abstract class AbstarctFactory {
  8.  
  9. protected abstract Animal getAnimal();
  10.  
  11. public Animal getAnimal(String name) {
  12. if ("Elephant".equals(name)) {
  13. return new ElephantFactory().getAnimal();
  14. }else if ("Leopard".equals(name)) {
  15. return new LeopardFactory().getAnimal();
  16. }else {
  17. return null;
  18. }
  19. }
  20.  
  21. }

来个实现方法,其中有一个默认的产生对象

  1. package com.wjc.Factory.abstra;
  2.  
  3. import com.wjc.Factory.Animal;
  4. import com.wjc.Factory.func.LeopardFactory;
  5.  
  6. public class Factory extends AbstarctFactory {
  7.  
  8. private LeopardFactory defaultFactory = new LeopardFactory();
  9.  
  10. @Override
  11. protected Animal getAnimal() {
  12. // TODO Auto-generated method stub
  13. return defaultFactory.getAnimal();
  14. }
  15.  
  16. }

测试一下性能

  1. package com.wjc.Factory.abstra;
  2.  
  3. public class Test {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. Factory factory = new Factory();
  8. System.out.println(factory.getAnimal("Elephant").eat());
  9.  
  10. }
  11.  
  12. }

上述改造后的代码就是抽象工厂模式了

小结一下工厂模式,特性是封装了创建Bean的过程。

Spring设计模式_工厂模式的更多相关文章

  1. spring设计模式_代理模式

    代理模式应该是Spring核心设计模式之一了 先说下代理模式特性: 1.有代理人和被代理人 2.对于被代理的人来说,这件事情是一定要做的,但是我又不想做,所有就找代理人来做. 3.需要获取到被代理人的 ...

  2. java设计模式_工厂模式

    关于设计模式 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结,是一种设计思维,使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证 ...

  3. .Net设计模式_工厂模式(3)

    3.抽象工厂模式 引言: 我们知道汽车需要很多部件才能组装成一辆成品的车,那么我们需要汽车厂生产很多东西,如:马达.车轴.轮胎等,这些东西组装起来后成为了一辆车. 这些东西就是产品族,图解:(出之ht ...

  4. .Net设计模式_工厂模式(1)

    工厂模式有三个模式: 简单工厂(Simple Factory)模式 工厂方法(Factory Method)模式 抽象工厂(Abstract Factory)模式 1.简单工厂 引言: 我是消费者,我 ...

  5. java_设计模式_工厂模式_Factory Pattern(2016-08-04)

    工厂模式主要是为创建对象提供了接口.工厂模式按照<Java与模式>中的提法分为三类: (1)简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory ...

  6. PHP设计模式_工厂模式

    个人理解工厂类相当于平时用的基类,只需要把类new一次然后付给一个变量,以后直接引入基类调用变量使用类里的方法即可 了解 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new. 使用工厂模式,可 ...

  7. Spring设计模式_策略模式/其他

    策略模式特性 1.执行最终结果一样 2.执行过程和执行逻辑不一样 3.使用同一接口 达到目的就可以了 Git地址 https://github.com/wujiachengSH/WjcStrategy ...

  8. .Net设计模式_工厂模式(2)

    2.工厂方法模式 引言: 上一篇中我们描述了简单工厂的缺点,而解决方法就是把工厂接口化,把工厂的行为标准化,这就是工厂方法模式. 理解: 工厂能制造A和B鞋,如果消费者现在要求制造C鞋.D鞋...咋办 ...

  9. Spring 实现两种设计模式:工厂模式和单态模式(单例模式)

    本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...

随机推荐

  1. 给JS包写TypeScript用的类型申明文件

    TS (TypeScript)区别于JS (JavaScript)一个最大的不同是TS增加了类型.当一些TS代码要使用JS包的时候,最好这些JS包都有类型介绍,比如这个变量是什么类型,那个函数参数的什 ...

  2. 浅谈Java语言中try{}catch{}和finally{}的执行顺序问题

    浅谈Java语言中try{}catch{}和finally{}的执行顺序问题 2019-04-06  PM  13:41:46  1. 不管有没有出现异常,finally块中代码都会执行: 2. 当t ...

  3. redis对list进行的相关操作

    redis对list类型进行的相关操作以及如何在python使用 redis对list类型操作的命令: 命令 语法 概述 返回值 Redis Blpop 命令 BLPOP key1 [key2 ] t ...

  4. <玩转Django2.0>读书笔记:模板和模型

    1. 模板内置标签 Django常用内置标签 标签 描述 {% for %} 遍历输出变量的内容 {% if %} 对变量进行条件判断 {% csrf_token %} 生成csrf_token标签, ...

  5. USACO 邮票 Stamps

    f[x]表示组成 x 最少需要的邮票数量 一一举例 最多贴5张邮票,有三种邮票可用,分别是1分,3分,8分 组成0分需要0张邮票 ——f[0]=0 组成1分需要在0分的基础上加上一张1分邮票 ——f[ ...

  6. Python操作Excel, 开发和调用接口,发送邮件

    笔记: 上周回顾: 模块: 导入模块的顺序 lyl.py # def hhh(): pass name = 'lyl' a.py import lyl import sys from lyl impo ...

  7. Hashlib加密,内置函数,安装操作数据库

    hashlib模块的md5加密: md5同样的内容加密后是一样的 md5加密后是不可逆的.即能加密,没办法解密. 撞库: 只是针对简单的,因为同样的内容加密后是一样的,难一点就不行了. 登录密码:注册 ...

  8. acl权限命令

    1.查看acl命令 getfacl 文件名 #查看acl权限 2.设定acl权限命令 setfacl 选项 文件名 选项: -m 设置ACL权限 -x 删除指定的ACL权限 -b 删除所有的ACL设定 ...

  9. word文档最上面有一条不是页眉的线

    word2013文档最上面有一条不是页眉的线 在编辑Word文档时发现文档上面出现了一条实线,而且并非页眉,这里我采取了一个方式: 找到[设计]---[页面边框] 找到[边框和底纹]----[页面边框 ...

  10. pyhton中常用的基础模块

    目前在看Google的DetectionAPI源码,自己的Python功底不是很好,看到了哪些模块就随手记一下. 1.abc模块,参考https://www.cnblogs.com/wancy86/p ...