设计模式学习笔记------简单工厂
简单工厂
一、实例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
设计模式学习笔记------简单工厂相关推荐
- 设计模式学习笔记——抽象工厂(Abstract Factory)模式
设计模式学习笔记--抽象工厂(Abstract Factory)模式 @(设计模式)[设计模式, 设计模式中文名, 设计模式英文名] 设计模式学习笔记抽象工厂Abstract Factory模式 基本 ...
- 设计模式工作笔记-简单工厂场景与实现(针对接口编程的设计思想)
简单工厂:通过接口的方式,把实现和变化隔离 接口编程:是一种特殊的抽象类,是一个纯虚类.通常接口来定义类的外部,就相当于一份契约,其实就是根据外部应用 需要的功能,约定了实现类应该要实现的功能. 软件 ...
- 设计模式学习-简单工厂模式
模式概述: 专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属 ...
- 设计模式心得笔记--简单工厂
说到简单工厂,就不得不说到switch,其实简单工厂的关键,是把分支从主类的流程中分离出去,单独变成一个一个分散的类,然后把switch放到主类的实例化中去,不同的分支从一开始就实例化了不同的对象,这 ...
- 设计模式学习--------3.简单工厂模式学习
场景: 服务端编写API方法供客户端调用,需要将接口与实现分离,客户端不需要知道具体实现,高度解耦,面向接口的编程. 定义: 提供一个创建对象实例的功能,而无须关心其具体实现,被创建实例的类型可以是接 ...
- 设计模式之笔记--简单工厂模式(Simple Factory)
简单工厂模式(Simple Factory) 类图 描述 简单工厂: 一个抽象产品类,可以派生多个具体产品类: 一个具体工厂类: 工厂只能创建一个具体产品. 应用场景 汽车接口 public inte ...
- 设计模式学习笔记二:简单工厂模式
含义: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创 ...
- 设计模式学习笔记-2 创建者模式-工厂方法模式
设计模式学习笔记-2 创建者模式-工厂方法模式 工厂模式介绍 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 这种设计模式使Java开 ...
- 设计模式 - 学习笔记 - 工厂模式Factory Pattern
设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...
最新文章
- Android 屏幕自动旋转-Sensor属性
- 安装 postgresql
- VTK:PolyData之CellLocator
- 20个优秀的移动(iPhone)网站设计案例
- redis streams_初步了解Redis Streams以及如何在Java中使用它们
- 《C++ Primer 第五版》(第6.1~6.3节) 函数形参和实参传递,可变参数列表和函数返回值
- Git(12)-stash, reflog
- 调试器无法终止一个或多个进程_EXCEL按多个分隔符号无法分列,没关系,一个M函数全搞定...
- C语言实现函数调用的三种方法
- mysql面试通关宝典,你看你知道多少
- 澳门人均GDP比香港高,但为什么很多人感觉澳门没有香港富有?
- Freeswitch部署
- android root权限命令行,android在apk中获取root权限,并执行命令
- mysql 允许局域网连接,怎么设置Mysql允许局域网或外部连接的方法
- 基于C#+ASP.NET 毕业设计526套(保持更新)(建议CTRL+D)
- Spring Boot Redis 实现分布式锁,真香,你掌握了多少?
- 江苏辖区农商银行2020年(科技类)
- linux su -sh,Linux学习-- su -和 su的区别深入解析
- ubuntu和windows双系统默认启动顺序
- 数据结构极客视频5_DFS的题目