亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

工廠模式及在項目中的應用

2019-11-11 05:41:03
字體:
來源:轉載
供稿:網友

工廠模式分為簡單工廠、工廠方法模式和抽象工廠模式。簡單工廠顧名思義是最簡單的,從一個工廠獲取所需的產品類似于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 {	@Override	public void add(User user) {		System.out.println("UserJDBCDao....add");	}	@Override	public void delete(int id) {		System.out.println("UserJDBCDao....delete");	}	@Override	public void update(User user) {		System.out.println("UserJDBCDao....update");	}}//針對JDBC的產品2實現
public class AddressJDBCDao implements IAddressDao {	@Override	public void add(Address address, int userId) {		System.out.println("addressJDBCDao....add");	}	@Override	public void update(Address address) {		System.out.println("addressJDBCDao....update");	}	@Override	public 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;	}	@Override	public IUserDao createUserDao() {		return new UserJDBCDao();	}	@Override	public IAddressDao createAddressDao() {		return new AddressJDBCDao();	}}//工廠接口實現1(JDBC)
public class UserMySQLDao implements IUserDao {	@Override	public void add(User user) {		System.out.println("UserMySqlDao....add");	}	@Override	public void delete(int id) {		System.out.println("UserMySQlDao....delete");	}	@Override	public void update(User user) {		System.out.println("UserMySqlDao....update");	}	}//針對MySql的產品2實現
public class AddressMySqlDao implements IAddressDao {	@Override	public void add(Address address, int userId) {		System.out.println("addressMySqlDao....add");	}	@Override	public void update(Address address) {		System.out.println("addressMySqlDao...update");	}	@Override	public 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;	}		@Override	public IAddressDao createAddressDao() {		return new AddressMySqlDao();	}	@Override	public 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;	}	@Override	public 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.PropertiesFactoryUserDao="com.yan.factory.dao.UserJDBCDao"


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久一区二区三区| 国产精品一区二区久久精品| 亚洲欧美在线x视频| 亚洲美女精品久久| 欧美怡春院一区二区三区| 亚洲综合第一页| 久久免费观看视频| 国产成人精品在线播放| 欧美精品videossex性护士| 国产视频综合在线| 最近更新的2019中文字幕| 91精品视频在线免费观看| 久久香蕉国产线看观看网| 国产精品麻豆va在线播放| 岛国视频午夜一区免费在线观看| 国产成人免费91av在线| …久久精品99久久香蕉国产| 综合网日日天干夜夜久久| 伊人一区二区三区久久精品| 91热精品视频| 精品国产一区二区三区久久久狼| 中文字幕亚洲欧美日韩在线不卡| 久久伊人免费视频| 欧亚精品中文字幕| 亚洲黄在线观看| 精品国产欧美成人夜夜嗨| 国产福利成人在线| 国产精品高潮粉嫩av| 国产精品久久久久久久久借妻| 国产精品久久91| 日本欧美一二三区| 国产成人久久精品| 欧美国产第一页| 日韩欧美精品免费在线| 一区二区日韩精品| 欧美激情国产日韩精品一区18| 欧美日韩色婷婷| 日韩av免费在线看| 欧美精品亚州精品| 欧美有码在线观看| 亚洲高清在线观看| 日韩精品亚洲精品| 国产欧美日韩精品在线观看| 国产综合在线视频| 97视频免费在线看| 中文字幕精品网| 日韩欧美国产高清91| 亚洲色图激情小说| 日本精品视频网站| 精品国产乱码久久久久久虫虫漫画| 欧美国产精品人人做人人爱| 久久综合网hezyo| 日韩av快播网址| 国产精品热视频| 欧美日韩亚洲网| 欧美成人久久久| 久久久久久这里只有精品| 久久久爽爽爽美女图片| 国产美女被下药99| 久久人91精品久久久久久不卡| 久久中国妇女中文字幕| 国产成人涩涩涩视频在线观看| 精品国产依人香蕉在线精品| 亚洲免费电影一区| 亚洲视频视频在线| 91精品综合视频| 久久久国产精品一区| 国产日产欧美a一级在线| 国产精品美女免费看| 日韩欧美一区视频| 久久香蕉国产线看观看av| 超薄丝袜一区二区| 最新91在线视频| 亚洲视频精品在线| 国产成人欧美在线观看| 日韩中文字幕免费视频| 国产精品极品尤物在线观看| 91久久精品美女| 国产男人精品视频| 色99之美女主播在线视频| 精品亚洲国产视频| 狠狠色狠色综合曰曰| 国产欧美日韩综合精品| 国产视频精品xxxx| 国产在线精品播放| 欧美限制级电影在线观看| 欧美另类69精品久久久久9999| 亚洲精品久久久久久久久久久久久| 亚洲一品av免费观看| 日韩成人黄色av| 色综合导航网站| 久久免费少妇高潮久久精品99| 国产精品入口日韩视频大尺度| 亚洲电影av在线| 日韩欧美在线看| 久久久精品中文字幕| 亚洲精品欧美日韩专区| 成人黄色中文字幕| 成人国产亚洲精品a区天堂华泰| 最近2019中文字幕在线高清| 午夜精品一区二区三区视频免费看| 久久久久久成人精品| 伦理中文字幕亚洲| 欧美乱妇高清无乱码| 成人免费高清完整版在线观看| 午夜免费在线观看精品视频| 中文日韩在线视频| 欧美电影免费观看高清完整| 日韩在线视频观看| 成人h片在线播放免费网站| 中文字幕亚洲欧美日韩在线不卡| 久久久精品久久久| 2019日本中文字幕| 日韩在线观看免费网站| 成人免费在线网址| 欧美成人免费全部观看天天性色| 日韩性生活视频| 中文字幕日韩免费视频| 亚洲成人av在线播放| 亚洲国产精品大全| 中文字幕亚洲无线码在线一区| 日韩中文字幕第一页| 福利一区福利二区微拍刺激| 久久天天躁狠狠躁夜夜躁| 超碰精品一区二区三区乱码| 日韩免费在线视频| 亚洲美女又黄又爽在线观看| 伊人成人开心激情综合网| 日韩视频在线免费观看| 国产精品人成电影| 国产亚洲美女精品久久久| 在线播放精品一区二区三区| 日韩一级裸体免费视频| 国产精品影院在线观看| 欧美人成在线视频| 国产成人一区二区三区小说| 久久亚洲精品成人| 久久精品国产免费观看| 日韩欧美国产成人| 红桃视频成人在线观看| 成人黄色片网站| 亚洲成av人影院在线观看| 正在播放亚洲1区| 日韩在线资源网| 亚洲免费视频一区二区| 欧美激情视频一区| 久久久999精品免费| 92国产精品久久久久首页| 国产免费久久av| 日韩av手机在线观看| 欧美综合国产精品久久丁香| 欧美性理论片在线观看片免费| 欧美激情视频一区二区三区不卡| 色偷偷88888欧美精品久久久| 黄网站色欧美视频| 成人在线视频福利| 一二美女精品欧洲| 亚洲а∨天堂久久精品喷水| 国产精品视频网址| 夜夜嗨av一区二区三区四区| 91精品综合视频| 91色视频在线观看| 中文字幕日韩在线观看| 欧美午夜视频在线观看|