工廠模式j(luò)ava源代碼 java簡單工廠模式及代碼

求java工廠模式的一個簡單代碼例子,盡量簡單

這個應(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ù)要求動態(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());

}

}

}

java 抽象工廠模式

工廠模式在項(xiàng)目中是常常用到的,有人說只有大項(xiàng)目才會用到,小項(xiàng)目是體會不出來.其實(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)目中客戶的需求是常常變動的,臨時更換數(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)時必須分?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) (與平時有所不同,如果有10個數(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

寫一個抽象工廠模式 java實(shí)例 出來

工廠模式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)部會自動進(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 編寫程序?qū)懗龊唵蔚墓S模式?

java中工廠模式分為:

簡單工廠模式(Simple Factory)?

2. 工廠方法模式(Factory Method)?

3. 抽象工廠模式(Abstract Factory)

每種方法的實(shí)現(xiàn)不同

提供一個簡單工廠模式的案例:

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://www.muchs.cn/article46/doocihg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)定制開發(fā)、品牌網(wǎng)站制作、移動網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管