先说下工厂模式的特性

  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设计模式_工厂模式的更多相关文章

  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. CocosCraetor中图像资源Texture和SpriteFrame的区别

    Texture是保存在GPU缓冲中的一张纹理.是由一张图片创建获得的. SpriteFrame是Texture+Rect,根据一张纹理材质来剪切获得. SpriteFrame是Texture+Rect ...

  2. 今日头条Marketing API小工具(.Net Core版本)

    前言 由于工作原因,需要用到今日头条的Marketing API做一些广告投放的定制化开发.然后看现在网上也没多少关于头条Marketing API的文章,于是便就有了该篇文章. 头条Marketin ...

  3. 2018-2019-2 网络对抗技术 20165239 Exp2 后门原理与实践

    一.实验要求 (3.5分) (1)使用netcat获取主机操作Shell,cron启动 (0.5分) (2)使用socat获取主机操作Shell, 任务计划启动 (0.5分) (3)使用MSF met ...

  4. python中for嵌套打印图形

    # 打印出九九乘法表 1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 1 ...

  5. Django缓存机制

    缓存介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增删改查,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的后台操作,都会消耗很多的服务 ...

  6. [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算

    [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算 题目大意: 一个长度为\(n(n\le10^6)\)的序列\(A\).\(m(m\le10^6)\)次 ...

  7. banner | what is the "banner" ?

    banner/横幅   获取 banner(横幅) 信息属于信息搜集   因为在 banner 信息中,可以获取到软件开发商.软件名称.服务类型.版本号等   而版本号有时候就会存在公开的 CVE 问 ...

  8. Chrome_高亮显示当前改变的区域

  9. Android Studio的构建系统:Gradle

    原文作者:youxiachai <用Gradle 构建你的android程序> 前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android st ...

  10. 源码安装python +NGINX 的坎坷路 +uwsgi安装 部署django 的CRM项目

    一.Nginx安装(基于ubuntu17.10 版本) 首先我们是基于源码安装,主要有如下步骤 1.安装依赖包 1.安装gcc g++的依赖库 sudo apt-get install build-e ...