简单工厂

一、实例1

 1 /**
 2  * 定义接口
 3  * @author abc
 4  *
 5  */
 6 public interface Api {
 7     public void test1();
 8 }
 9
10 /**
11  * 接口实现类1
12  * @author abc
13  *
14  */
15 public class Impl1 implements Api {
16
17     @Override
18     public void test1() {
19         System.out.println("实现test1方法");
20     }
21 }
22
23 /**
24  * 接口实现类2
25  * @author abc
26  *
27  */
28 public class Impl2 implements Api {
29
30     @Override
31     public void test1() {
32         System.out.println("实现test1方法");
33     }
34 }
35
36 /**
37  * 工厂类
38  * @author abc
39  *
40  */
41 public class Factory {
42     /**
43      * 根据条件创建不同的实现来
44      * @param condition 实现条件
45      * @return
46      */
47     public static Api createImpl(int condition) {
48         Api api = null;
49         if (condition == 1) {
50             api = new Impl1();
51         } else if (condition == 2) {
52             api = new Impl2();
53         }
54         return api;
55     }
56
57     public static void main(String[] args) {
58         Api api = Factory.createImpl(1);
59         api.test1();
60         api = Factory.createImpl(2);
61         api.test1();
62
63     }
64 }

用户可以通过工厂来获取接口的实现类,可直接操作接口定义的方法。用户不需要知道具体方法是如何实现的。

实例1可以实现简单工厂模式,但是存在一个缺点,用户需要传入选择参数,这就说明用户必须知道每个参数的含义,也需要理解每个参数对应的功能处理,从一定的程度上想用户暴露了内部实现细节

二、实例2--配置文件实现

/*** 定义接口* @author abc**/
public interface Api {public void test1();
}/*** 接口实现类1* @author abc**/
public class Impl1 implements Api {@Overridepublic void test1() {System.out.println("实现test1方法");}
}/*** 接口实现类2* @author abc**/
public class Impl2 implements Api {@Overridepublic void test1() {System.out.println("实现test1方法");}
}package cn.itcast.demo;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;import javax.xml.ws.FaultAction;/*** 工厂类* @author abc**/
public class Factory {/*** 根据条件创建不同的实现来* @param condition 实现条件* @return*/public static Api createImpl() {Properties p = new Properties();InputStream in = null;Api api = null;try {in = Factory.class.getResourceAsStream("FactoryTest.properties");p.load(in);} catch (IOException e) {e.printStackTrace();} finally {try {if (in != null) {in.close();in = null;}} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}try {api = (Api)Class.forName(p.getProperty("FactoryTest")).newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();}return api;}public static void main(String[] args) {Api api = Factory.createImpl();api.test1();}
}FactoryTest.properties
#配置文件
FactoryTest=cn.itcast.demo.Impl1

在实例一中,如果需要添加一个实现类,则需要更改工厂类。二在实例二中,可以通过反射和配置文件(这里用的式properties,一般实际都使用xml配置)就可以实现在调节实现类后,无需更改代码就能将实现类添加到应用中。

三、简单工厂优缺点

优点:

  1.帮助封装

    简单工厂虽然很简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。

  2.解耦

    通过简单工厂,实现了客户端和具体实现类的解耦

    如同上面的例子,客户端根本就不知道具体是由谁类实现,也不知道具体是如何实现的,客户端只是通过工厂获取需要它的接口对象。

缺点:

  1.可能增加客户端的复杂度

    如果通过客户端的参数了现在具体的实现类,那么就必须让客户端你理解各个参数所代表的具体功能和含义,这样会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以      选用可配置的方式来实现。

  2.不方便扩展子工厂

    私有化简单工厂的构造方法,使用静态方法来创建几口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为。不过,通常情况下是不需要为简单工厂创建子的。

四、简单工厂的本质

  简单工厂的本质是:选择实现 

  简单工厂的重点在选择,实现是已经做好了的。就算实现再简单,也要有具体的实现类类实现,而不是在简单工厂里面来实现。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端和实现之间解耦。这样一来,具体实现发生了变化,就不用变动客户端,这个变化会被简单工厂吸收和屏蔽掉。

五、何时选择简单工厂模式

  1. 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无需关心具体实现。

  2.如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。

转载于:https://www.cnblogs.com/chensheng0617/p/8176205.html

设计模式学习笔记------简单工厂相关推荐

  1. 设计模式学习笔记——抽象工厂(Abstract Factory)模式

    设计模式学习笔记--抽象工厂(Abstract Factory)模式 @(设计模式)[设计模式, 设计模式中文名, 设计模式英文名] 设计模式学习笔记抽象工厂Abstract Factory模式 基本 ...

  2. 设计模式工作笔记-简单工厂场景与实现(针对接口编程的设计思想)

    简单工厂:通过接口的方式,把实现和变化隔离 接口编程:是一种特殊的抽象类,是一个纯虚类.通常接口来定义类的外部,就相当于一份契约,其实就是根据外部应用 需要的功能,约定了实现类应该要实现的功能. 软件 ...

  3. 设计模式学习-简单工厂模式

    模式概述: 专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属 ...

  4. 设计模式心得笔记--简单工厂

    说到简单工厂,就不得不说到switch,其实简单工厂的关键,是把分支从主类的流程中分离出去,单独变成一个一个分散的类,然后把switch放到主类的实例化中去,不同的分支从一开始就实例化了不同的对象,这 ...

  5. 设计模式学习--------3.简单工厂模式学习

    场景: 服务端编写API方法供客户端调用,需要将接口与实现分离,客户端不需要知道具体实现,高度解耦,面向接口的编程. 定义: 提供一个创建对象实例的功能,而无须关心其具体实现,被创建实例的类型可以是接 ...

  6. 设计模式之笔记--简单工厂模式(Simple Factory)

    简单工厂模式(Simple Factory) 类图 描述 简单工厂: 一个抽象产品类,可以派生多个具体产品类: 一个具体工厂类: 工厂只能创建一个具体产品. 应用场景 汽车接口 public inte ...

  7. 设计模式学习笔记二:简单工厂模式

    含义: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创 ...

  8. 设计模式学习笔记-2 创建者模式-工厂方法模式

    设计模式学习笔记-2 创建者模式-工厂方法模式 工厂模式介绍 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 这种设计模式使Java开 ...

  9. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

最新文章

  1. Android 屏幕自动旋转-Sensor属性
  2. 安装 postgresql
  3. VTK:PolyData之CellLocator
  4. 20个优秀的移动(iPhone)网站设计案例
  5. redis streams_初步了解Redis Streams以及如何在Java中使用它们
  6. 《C++ Primer 第五版》(第6.1~6.3节) 函数形参和实参传递,可变参数列表和函数返回值
  7. Git(12)-stash, reflog
  8. 调试器无法终止一个或多个进程_EXCEL按多个分隔符号无法分列,没关系,一个M函数全搞定...
  9. C语言实现函数调用的三种方法
  10. mysql面试通关宝典,你看你知道多少
  11. 澳门人均GDP比香港高,但为什么很多人感觉澳门没有香港富有?
  12. Freeswitch部署
  13. android root权限命令行,android在apk中获取root权限,并执行命令
  14. mysql 允许局域网连接,怎么设置Mysql允许局域网或外部连接的方法
  15. 基于C#+ASP.NET 毕业设计526套(保持更新)(建议CTRL+D)
  16. Spring Boot Redis 实现分布式锁,真香,你掌握了多少?
  17. 江苏辖区农商银行2020年(科技类)
  18. linux su -sh,Linux学习-- su -和 su的区别深入解析
  19. ubuntu和windows双系统默认启动顺序
  20. 数据结构极客视频5_DFS的题目

热门文章

  1. CF813E Army Creation
  2. 基于SpringBoot的后台管理系统(异常、注解、node、page)(二)
  3. 9.6-9.7 awk
  4. oracle报错注入的一些函数
  5. [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹
  6. 将文本文件内容存储在DataSet中的方法总结
  7. 触发器创建删除等操作
  8. oracle v$sysstat性能视图
  9. Linq To Entity 的分页讨论
  10. 在内核中如何获得系统的日期和时间