Spring设计模式_工厂模式

先说下工厂模式的特性

  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
24
25 }

然后我们来定义一个工厂

 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
 4 import com.wjc.Factory.Animal;
 5 import com.wjc.Factory.Leopard;
 6
 7 public class LeopardFactory implements Factory {
 8
 9     //来个单例工厂好了
10     private static class  LeopardBean {
11         private static final Leopard INSTANCE = new Leopard();
12     }
13
14
15     @Override
16     public Animal getAnimal() {
17         // TODO Auto-generated method stub
18         return LeopardBean.INSTANCE;
19     }
20
21 }

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
13 }

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

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

原文地址:https://www.cnblogs.com/wujc/p/10585387.html

时间: 2024-10-11 22:02:05

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

Java设计模式_工厂模式

简单工厂模式 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例.(不修改代码的话,是无法扩展的. ) 1 //产品接口 2 interface IProduct { 3 public void productName(); 4 } 5 6 //产品实体类 7 class ProductA implements IProduct { 8 @Override 9 public void productName() { 10 System.out.println("pr

PHP设计模式_工厂模式

个人理解工厂类相当于平时用的基类,只需要把类new一次然后付给一个变量,以后直接引入基类调用变量使用类里的方法即可 了解 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new. 使用工厂模式,可以避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数,只需要在工厂类里修改需要new的类名即可.如果我们不使用工厂方式实例化这些类,则需要每一个类都需要new一遍,过程不可控,类多了,到处都是new的身影引进工厂模式,通过工厂统一创建对象实例. 代码 简单案例① <

day06_02_设计模式_工厂模式

Define an interface for creating on object, but let subclasses decide which class to instantiate Factory Method lets a class defer instantiation to subclasses. 定义一个用于创建对象的接口,让子类决定实例化哪一类. 抽象产品类Product : 产品的抽象,归纳 抽象创建类Creator : 基于抽象层面,关心的只是抽象层,而不关心子类.类

Spring 实现两种设计模式:工厂模式和单态模式

在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工厂模式可将Java 对象的调用者从被调用者的实现逻辑中分离出来,调用者只需关心被调用者必须满足的规则(接口) ,而不必关心实例的具体实现过程.这是面向接口编程的优势,能提高程序的解耦,避免所有的类以硬编码方式耦合在一起. 如果所有的类直接耦合,极易形成"骨牌效应",假如B 类调用了A 类,一旦A 类需要修改,则B 类也需要修改:假如C 类调用了B 类,则C 类也需要修改......依次类推,从而导致整个系统都需要改写

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

JS 设计模式(工厂模式环境搭建)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(工厂模式)--> //搭建一个工厂环境 //卖车店 function CarShop(){}; CarShop.prototype={ cons

设计模式 5 —— 工厂模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式(迭代器) 设计模式 4 —— 迭代器和组合模式(组合) 设计模式 5 —— 工厂模式 设计模式 5 -- 工厂模式,布布扣,bubuko.com