這個(gè)應(yīng)該比較簡單一點(diǎn)。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供阜新企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、HTML5、小程序制作等業(yè)務(wù)。10年已為阜新眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
某系統(tǒng)日志記錄器要求支持多種日志記錄方式,如文件記錄、數(shù)據(jù)庫記錄等,且用戶可以根據(jù)要求動(dòng)態(tài)選擇日志記錄方式?,F(xiàn)使用工廠方法模式設(shè)計(jì)該系統(tǒng),并寫出相應(yīng)Java代碼。
interface Log{
public void writeLog();
}
class FileLog implements Log{
public void writeLog(){
System.out.println("文件記錄");
}
}
class DatabaseLog implements Log{
public void writeLog(){
System.out.println("數(shù)據(jù)庫記錄");
}
}
interface LogFactory{
public Log createLog();
}
class FileLogFactory implements LogFactory{
public Log createLog(){
return new FileLog();
}
}
class DatabaseLogFactory implements LogFactory{
public Log createLog(){
return new DatabaseLog();
}
}
public class Client{
public static void main(String[] args) {
try{
Log log;
LogFactory factory;
//這里可以改成使用DOM和Java反射機(jī)制讀取XML文件,獲取工廠類名
factory=new DatabaseLogFactory ();
log=factory.createLog();
log.writeLog();
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
工廠模式在項(xiàng)目中是常常用到的,有人說只有大項(xiàng)目才會(huì)用到,小項(xiàng)目是體會(huì)不出來.其實(shí)使用設(shè)計(jì)模式與項(xiàng)目的大小沒有實(shí)質(zhì)性的聯(lián)系.設(shè)計(jì)模式是經(jīng)驗(yàn)的總結(jié)而不是衡量項(xiàng)目大小的標(biāo)準(zhǔn).
以開發(fā)項(xiàng)目的DAO層為例,在項(xiàng)目中客戶的需求是常常變動(dòng)的,臨時(shí)更換數(shù)據(jù)庫的需求也是常常發(fā)生的,那我們要如何解決跨數(shù)據(jù)庫的功能,這里就要使用到抽象工廠模式了.工廠模式常常用于創(chuàng)建多系列化的對象(如Orale系列,MySql系列)
1.首先定義相關(guān)接口(與平常的做法沒什么區(qū)別)
Java代碼
// 角色表DAO接口
interface IroleDao {
void insert();
void update();
}
// 用戶表DAO接口
interface IuserDao {
void find();
void delete();
}
// 角色表DAO接口
interface IroleDao {
void insert();
void update();
}
// 用戶表DAO接口
interface IuserDao {
void find();
void delete();
} 2.不同的數(shù)據(jù)庫有不同的SQL語句所以實(shí)現(xiàn)時(shí)必須分?jǐn)?shù)據(jù)庫來實(shí)現(xiàn)
Java代碼
// 用戶表Oralce數(shù)據(jù)庫DAO
class OracleuserDao implements IuserDao {
public void delete() {
System.out.println("Oralce 刪除用戶表數(shù)據(jù)");
}
public void find() {
System.out.println("Oralce 查詢用戶表數(shù)據(jù)");
}
}
// 用戶表MySql數(shù)據(jù)庫DAO
class MySqluserDao implements IuserDao {
public void delete() {
System.out.println("MySql 刪除用戶數(shù)據(jù)");
}
public void find() {
System.out.println("MySql 查詢用戶數(shù)據(jù)");
}
}
// 角色表Oracle數(shù)據(jù)庫DAO
class OracleroleDao implements IroleDao {
public void insert() {
System.out.println("Oralce 對角色表插入數(shù)據(jù)");
}
public void update() {
System.out.println("Oracle 對角色表更新數(shù)據(jù)");
}
}
// 角色表MySql數(shù)據(jù)庫DAO
class MySqlroleDAO implements IroleDao {
public void insert() {
System.out.println("MySql 對角色表插入數(shù)據(jù)");
}
public void update() {
System.out.println("Mysql 對角色表更新數(shù)據(jù)");
}
}
// 用戶表Oralce數(shù)據(jù)庫DAO
class OracleuserDao implements IuserDao {
public void delete() {
System.out.println("Oralce 刪除用戶表數(shù)據(jù)");
}
public void find() {
System.out.println("Oralce 查詢用戶表數(shù)據(jù)");
}
}
// 用戶表MySql數(shù)據(jù)庫DAO
class MySqluserDao implements IuserDao {
public void delete() {
System.out.println("MySql 刪除用戶數(shù)據(jù)");
}
public void find() {
System.out.println("MySql 查詢用戶數(shù)據(jù)");
}
}
// 角色表Oracle數(shù)據(jù)庫DAO
class OracleroleDao implements IroleDao {
public void insert() {
System.out.println("Oralce 對角色表插入數(shù)據(jù)");
}
public void update() {
System.out.println("Oracle 對角色表更新數(shù)據(jù)");
}
}
// 角色表MySql數(shù)據(jù)庫DAO
class MySqlroleDAO implements IroleDao {
public void insert() {
System.out.println("MySql 對角色表插入數(shù)據(jù)");
}
public void update() {
System.out.println("Mysql 對角色表更新數(shù)據(jù)");
}
}
這里增加了一套DAO的實(shí)現(xiàn) (與平時(shí)有所不同,如果有10個(gè)數(shù)據(jù)庫就要加上10種不同的實(shí)現(xiàn),比較麻煩呀)
3.定義DAO工廠接口與實(shí)現(xiàn)(利用java反射機(jī)制生產(chǎn)出你需要的DAO如:userDAO,roleDao)
Java代碼
// DAO工廠
abstract class DaoFactory {
public static DaoFactory getInstance(String classname) {
DaoFactory dao = null;
try {
dao = (DaoFactory) Class.forName(classname).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return dao;
}
abstract IuserDao getuserdao();
abstract IroleDao getroledao();
}
// Oralce工廠
class OracleFactory extends DaoFactory {
public IroleDao getroledao() {
return new OracleroleDao();
}
public IuserDao getuserdao() {
return new OracleuserDao();
}
}
// MySql工廠
class MysqlFactory extends DaoFactory {
public IroleDao getroledao() {
return new MySqlroleDAO();
}
public IuserDao getuserdao() {
return new MySqluserDao();
}
}
// DAO工廠
abstract class DaoFactory {
public static DaoFactory getInstance(String classname) {
DaoFactory dao = null;
try {
dao = (DaoFactory) Class.forName(classname).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return dao;
}
abstract IuserDao getuserdao();
abstract IroleDao getroledao();
}
// Oralce工廠
class OracleFactory extends DaoFactory {
public IroleDao getroledao() {
return new OracleroleDao();
}
public IuserDao getuserdao() {
return new OracleuserDao();
}
}
// MySql工廠
class MysqlFactory extends DaoFactory {
public IroleDao getroledao() {
return new MySqlroleDAO();
}
public IuserDao getuserdao() {
return new MySqluserDao();
}
}
4. 定義配置文件
Java代碼
class Config {
// Oralce
static final String ORALCE = "org.abc.OracleFactory";
static final String MYSQL = "org.abc.MysqlFactory";
}
class Config {
// Oralce
static final String ORALCE = "org.abc.OracleFactory";
static final String MYSQL = "org.abc.MysqlFactory";
}
配置文件可以定義到XML中去(好處:修改配置項(xiàng)之后不需要對JAVA文件進(jìn)行編譯.)
5.測試你的輸出的DAO
Java代碼
public class Dao {
public static void main(String[] args) {
DaoFactory.getInstance(Config.ORALCE).getroledao().insert();
DaoFactory.getInstance(Config.MYSQL).getroledao().insert();
}
}
public class Dao {
public static void main(String[] args) {
DaoFactory.getInstance(Config.ORALCE).getroledao().insert();
DaoFactory.getInstance(Config.MYSQL).getroledao().insert();
}
}
總結(jié)
使用條件:一系列接口有一系列的實(shí)現(xiàn)
如上IuserDao、IroleDao等一系列的接口,他們可以有一系列的實(shí)現(xiàn)(Oracle方式、MySql方式)
OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO
組成元素(以上面例子)
一系列接口:IuserDao、IroleDao
一系列實(shí)現(xiàn):Oracle系列、MySql系列
系列工廠類:Oracle系列工廠類、MySql系列工廠類(必須繼承抽象工廠類)
抽象工廠類:DaoFactory
工廠模式j(luò)ava實(shí)例如下:
public interface Work {
void doWork();
}
ConcreteProduct
public class StudentWork implements Work {
public void doWork() {
? ?System.out.println("學(xué)生做作業(yè)!");
}
}
public class TeacherWork implements Work {
public void doWork() {
? ?System.out.println("老師審批作業(yè)!");
}
}
生產(chǎn)者
public interface IWorkFactory {
Work getWork();
}
ConcreteCreator
public class StudentWorkFactory implements IWorkFactory {
public Work getWork() {
? ?return new StudentWork();
}
}
public class TeacherWorkFactory implements IWorkFactory {
public Work getWork() {
? ?return new TeacherWork();
}
}
Test
public class Test {
public static void main(String[] args) {
? ?IWorkFactory studentWorkFactory = new StudentWorkFactory();
? ?studentWorkFactory.getWork().doWork();
? ?
? ?IWorkFactory teacherWorkFactory = new TeacherWorkFactory();
? ?teacherWorkFactory.getWork().doWork();
}
}
字符串反轉(zhuǎn)如下:
public String getReverseStr(String str)
{
String reverseStr = "";
if (null != str !str.equals(""))
{
? for (int i = 1 ; i =str.length(); i++){
? ? ? ??reverseStr += str.charAt(str.length() - i);
? ? ? ? // 依次按與原字符串相反的順序拼裝字符串,內(nèi)部會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換
? ? ? ? //str.length() - i剛好是str的下標(biāo),因?yàn)閕是從1開始
? }
}
return reverseStr;
}
冒泡排序算法,從小到大
public int[] sortArr(int[] targetArr){
? ? ?//小到大的排序
? ? ? ?int temp = 0;
? ? ? ?for(int i = 0;itargetArr.length;i++){
? ? ? ? ? ?for(int j = i;jtargetArr.length;j++){
? ? ? ? ? ? ? ?if(targetArr[i]targetArr[j]){
? ? ? ? ? ? ? ? ? ?temp = targetArr[i];
? ? ? ? ? ? ? ? ? ?targetArr[i] = targetArr[j];
? ? ? ? ? ? ? ? ? ?targetArr[j] = temp;
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ?}
? ? return?targetArr;
}
java中工廠模式分為:
簡單工廠模式(Simple Factory)?
2. 工廠方法模式(Factory Method)?
3. 抽象工廠模式(Abstract Factory)
每種方法的實(shí)現(xiàn)不同
提供一個(gè)簡單工廠模式的案例:
public abstract class Woman {
private String mySkill;
public String getMySkill() {
return mySkill;
}
public Woman() {
//System.out.println("我是女人");
}
public void setMySkill(String mySkill) {
this.mySkill = mySkill;
}
}
----------------------------
public class LovelinessWoman extends Woman{
/*
* 可愛型女人
*/
public LovelinessWoman()
{
String mySkill="撒過嬌、出過軌、勾引領(lǐng)導(dǎo)下過水";
? this.setMySkill(mySkill);
}
}
-----------------------------
public class SteelinessWoman extends Woman{
/*
* 冷酷型女人
*/
public SteelinessWoman()
{
String mySkill="裝過神、弄過鬼,跟別人老公親過嘴";
? this.setMySkill(mySkill);
}
}
--------------------------------------
public class WomanMakeFactory {
public Woman findWoman(int typeID) {
switch (typeID) {
case 1:
return new LovelinessWoman();
case 2:
return new VirtuousWoman();
case 3:
return new SteelinessWoman();
default:
return null;
}
}
public Woman findWoman(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
/*
* Type t = Type.GetType("SimpleFactory." + type);
* Woman wm =
* (Woman)Activator.CreateInstance(t); return wm;
*/
String string="cn.jbit.design.simplefactory."+type;
Class c = Class.forName(string);
Woman wm = (Woman) c.newInstance();
return wm;
}
}
-------------------------
調(diào)用
public class Test2 {
/**
* @param args
* @throws IllegalAccessException
* @throws InstantiationException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Scanner input=new Scanner(System.in);
boolean sel=false;
do {
System.out.println("請選擇你要找的女人的類型");
System.out.println("LovelinessWoman:可愛型女人 VirtuousWoman:善良型女人 SteelinessWoman:冷酷型女人");
String typeid=input.next();
? ? ? ?WomanMakeFactory factory = new WomanMakeFactory();
? ? ? ?Woman wm=factory.findWoman(typeid);
? ? ? ?System.out.println("該類型女人的新標(biāo)準(zhǔn):");
? ? ? ?System.out.println(wm.getMySkill());
? ? ?
? ? ? ?System.out.println("還想看看別的類型嗎?y代表想,n代表再也不想了");
? ? ?
? ? ? ?sel=input.next().equals("y");
} while (sel);
}
}
本文名稱:工廠模式j(luò)ava源代碼 java簡單工廠模式及代碼
地址分享:http://m.rwnh.cn/article46/doocihg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、定制開發(fā)、品牌網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)