工厂模式分为简单工厂、工厂方法模式和抽象工厂模式。简单工厂顾名思义是最简单的,从一个工厂获取所需的产品类似于factory.getProduct1();或factory.getProduct2(),最经典的运用switch语句。简单工厂要增加产品要修改源码,破坏ocp原则(对扩展开放,修改封闭)

工厂方法模式与简单工厂最不一样的是工厂方法模式有工厂接口

抽象工厂模式与工厂方法模式最大的不同:工厂方法模式的产品都衍生于同一个接口或抽象类,而抽象工厂模式的产品衍生自不同的接口或抽象类。因为工厂方法模式针对一个产品等级结构,而抽象工厂方法针对多个,分别对应一个接口(抽象类)和多个接口(抽象类)。什么产品等级结构?举个例子,比如车子,分奥迪和宝马,而奥迪和宝马分为大排量和小排量的,那么大排量的奥迪和小排量的奥迪属于同一产品等级结构,而大排量的奥迪和大排量的宝马属于同一产品族。如果针对一个产品等级结构,也就是奥迪或宝马,那么工厂产品为一个产品等级结构就使用工厂方法模式,如果针对多个,如宝马和奥迪,那么就使用抽象工厂模式,它的产品是一个产品族。这就是它们的应用场景。

这里用一个例子熟悉一下抽象工厂模式。(使用单例模式避免大量工厂创建,浪费资源,不懂看前面有一篇说单例的)

public interface IFactoryDao {public IUserDao createUserDao();public IAddressDao createAddressDao();
}//工厂接口
public interface IAddressDao {public  void add(Address address,int userId);public void update(Address address);public void delete(int id);}//产品1接口
public interface IUserDao {public void add(User user);public void delete(int id);public void update(User user);}//产品2接口
public class UserJDBCDao implements IUserDao {@Overridepublic void add(User user) {System.out.println("UserJDBCDao....add");}@Overridepublic void delete(int id) {System.out.println("UserJDBCDao....delete");}@Overridepublic void update(User user) {System.out.println("UserJDBCDao....update");}}//针对JDBC的产品2实现
public class AddressJDBCDao implements IAddressDao {@Overridepublic void add(Address address, int userId) {System.out.println("addressJDBCDao....add");}@Overridepublic void update(Address address) {System.out.println("addressJDBCDao....update");}@Overridepublic void delete(int id) {System.out.println("addressJDBCDao....delete");}}//针对JDBC的产品1实现
public class JDBCDaoFactory implements IFactoryDao {private static JDBCDaoFactory factory = new JDBCDaoFactory();private JDBCDaoFactory(){}public static IFactoryDao getInstance() {return factory;}@Overridepublic IUserDao createUserDao() {return new UserJDBCDao();}@Overridepublic IAddressDao createAddressDao() {return new AddressJDBCDao();}}//工厂接口实现1(JDBC)
public class UserMySqlDao implements IUserDao {@Overridepublic void add(User user) {System.out.println("UserMySqlDao....add");}@Overridepublic void delete(int id) {System.out.println("UserMySQlDao....delete");}@Overridepublic void update(User user) {System.out.println("UserMySqlDao....update");}}//针对MySql的产品2实现
public class AddressMySqlDao implements IAddressDao {@Overridepublic void add(Address address, int userId) {System.out.println("addressMySqlDao....add");}@Overridepublic void update(Address address) {System.out.println("addressMySqlDao...update");}@Overridepublic void delete(int id) {System.out.println("addressMySqlDao....delete");}}//针对MySql的产品1实现
public class MysqlDaoFactory implements IFactoryDao {private static IFactoryDao factory = new MysqlDaoFactory();private MysqlDaoFactory() { }public static IFactoryDao getInstance() {return factory;}@Overridepublic IAddressDao createAddressDao() {return new AddressMySqlDao();}@Overridepublic IUserDao createUserDao() {return new UserMySqlDao();}}//工厂实现2(MySql)

由两个工厂可以发现,两个工厂里的产品都是产品族(AddressMySqlDao和AddressJDBCDao是同一个接口的实现)

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在项目中调用工厂1或2也要修改代码,这也不好,因此可以用反射。把要创建的工厂className写在配置文件这样只需修改配置文件即可,灵活、不破坏封装性、ocp。

package com.yan.factory.dao;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;public class DaoUtil {public static IFactoryDao createDaoFactory() {IFactoryDao f = null;try {Properties prop = PropertiesUtil.getDaoProp();String fs = prop.getProperty("factory");Class clz = Class.forName(fs);String mn = "getInstance";Method m = clz.getMethod(mn);f = (IFactoryDao)m.invoke(clz);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return f;}
}

dao.properties文件

factory=com.yan.factory.dao.JDBCDaoFactory

可修改配置文件测试。

在项目中private IAddressDao addressDao = DaoUtil.createDaoFactory().createAddressDao();即可

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

上面有点缺点就是太繁杂,要创建多个工厂实例,我们可以利用反射,只创建一个工厂,把要创建的Dao写在配置文件

package com.yan.factory.dao;import java.util.HashMap;
import java.util.Map;
import java.util.Properties;public class PropertiesFactory implements IFactoryDao {private static PropertiesFactory f = new PropertiesFactory();private PropertiesFactory() {  }public static IFactoryDao getInstance() {return f;}@Overridepublic Object getDao(String name) {try {Properties prop = PropertiesUtil.getDaoProp();String cn = prop.getProperty(name);Object obj = Class.forName(cn).newInstance();System.out.println(obj);return obj;} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return null;}}
factory=com.yan.factory.dao.PropertiesFactory
UserDao="com.yan.factory.dao.UserJDBCDao"

工厂模式及在项目中的应用相关推荐

  1. 工厂模式在 Calendar 类中的应用

    在前面讲到工厂模式的时候,大部分工厂类都是以 Factory 作为后缀来命名,并且工厂类主要负责创建对象这样一件事情.但在实际的项目开发中,工厂类的设计更加灵活.那我们就来看下,工厂模式在 Java ...

  2. 伪代码的简单例子_使用策略+工厂模式彻底干掉代码中的if else!

    对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else. 一旦代码中if-else过多,就会大大的影响其可读性和 ...

  3. MVP模式在Android项目中的使用

    烦了在Activity中编写太多的代码,该app由我来主导.就选择用MVP模式. 概述 MVP是模型(Model).视图(View).主持人(Presenter)的缩写,分别代表项目中3个不同的模块. ...

  4. 工厂模式在iOS开发中的实际应用

    工厂模式 使用场景 好处 使用步骤 抽象类使用工厂方法生成具体子类,抽象类定义所有相关子类的共有的共同行为 各个具体工厂重载抽象父类工厂中定义的方法,各个子类拥有一组共同的行为,但实际实现不同 持有者 ...

  5. 简单工厂模式练习:简单工厂模式在农场系统中实现

    目录 前言 一.简单工厂模式 二.农场系统创建 1.先新建一个包.类以及抽象类 2.键入各类中代码 1 抽象产品角色  Fruit 2 实现产品角色  Apple 3实现产品角色  Grape 4实现 ...

  6. 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式

    文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...

  7. 工厂模式 java好处_java中工厂模式的优缺点有哪些

    java中工厂模式的优缺点有哪些 发布时间:2020-12-03 15:15:07 来源:亿速云 阅读:79 作者:Leah 这篇文章将为大家详细讲解有关java中工厂模式的优缺点有哪些,文章内容质量 ...

  8. 简单工厂模式-接口在设计模式中的应用之一

    接口在设计模式中的应用之一:简单工厂模式 无工厂:手工 缺点:麻烦,对每一个的要求都比较高 优点:个性化 工厂:生产产品 优点:批量生产,使用者比较方便,直接买 缺点:无法定制,如果非要定制就会比较麻 ...

  9. 从原理到实践:装饰器模式如何在项目中落地详解(给原对象增加新的行为和功能)

    装饰器模式---- 不修改原始对象,给原对象增加新的行为和功能. 2.1.概念 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许动态地向对象添加额外的功能,而无需修改其原始 ...

  10. 策略模式在公司项目中的运用实践,看完又可以涨一波实战经验了!

    营销系统是一个动态的.有机地结合的系统,经常会随着业务的不断变化发生调整,因此从事这一业务的开发可让我头疼了. 之前在工作中就不乏一次遇到过随意调整营销策略的情况,在部分场景下由于使用了硬编码的方式来 ...

最新文章

  1. Perfect Security (01字典树删除点)
  2. stm32的时钟系统
  3. get_magic_quotes_gpc异常
  4. 设计模式--桥(Bridge)模式
  5. sql语句的一些细节东西学起来还是很费劲的,希望以后注意下。算是经验吧
  6. MySQL名字的年夜小写敏感性
  7. java中swing循环_在Java游戏循环中使用“ SwingUtilities.invokeLa...
  8. python3多进程爬虫(第二卷)
  9. java下载的文件不完整_JAVA 解决FTP下载文件不完整问题
  10. 【POJ1958】【典型递推问题】汉诺塔问题
  11. Vue写的一个网站项目
  12. delphi 2007 精简版
  13. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day4)
  14. 阿里云 ECS windows服务器创建+部署+域名
  15. 深圳基因组所刘永鑫组招聘博士后4名(3年100万+文章奖励+项目绩效)
  16. 新版经营级秀出打赏系统源码+带支付模块/视频教程
  17. jQurey中getJSON方法错误回调方法
  18. 做完这套面试题,你才敢说懂Excel
  19. ETCgame移动端上线,预测游戏世界杯预测触手可及
  20. 灵飞经4 西城八部 第十八章 暗通款曲(三)

热门文章

  1. gmail设置双重验证后,第三工具无法登陆解决
  2. BTA 常问的 Java基础39道常见面试题
  3. 水果电商“异军突起”,资本市场为何竞相追捧?
  4. android京东源码下载,京东商城APP - 源码下载|通讯/手机编程|android开发|源代码 - 源码中国...
  5. Google黑客常用搜索语法
  6. 2021年美容师(中级)考试题及美容师(中级)模拟考试
  7. 方正飞鸿智能信息平台(Fix ES2007)
  8. XCVU13P FPGA开发板
  9. 国产化复旦微电子 FMQL45T900 FPGA开发板( 替代Xilinx ZYNQ ARM+FPGA 7045开发板)
  10. 求2+22+222+2222+22222