欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java工廠模式代碼實(shí)現(xiàn) java設(shè)計(jì)模式之工廠模式

Java的幾個(gè)工廠方法解析

Java工廠模式可分為三種:

創(chuàng)新互聯(lián)是一家專(zhuān)注于成都做網(wǎng)站、網(wǎng)站建設(shè)與策劃設(shè)計(jì),鐵西網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:鐵西等地區(qū)。鐵西做網(wǎng)站價(jià)格咨詢:13518219792

1.靜態(tài)工廠模式

2.工廠方法模式

3.抽象工廠模式

一、靜態(tài)工廠模式:用靜態(tài)的方法實(shí)現(xiàn),其創(chuàng)建的對(duì)象具有一定的特性

舉例如下:

Vehicle類(lèi):

public abstract class Vehicle

{

private String name;

public Vehicle (){

super();

}

public Vehicle (String name){

super();

this.name=name;

}

public abstract void run();

public String getName(){

return name;

}

public void setName(String name){

this.name=name;

}

}

Bus類(lèi):

public class Bus extends Vehicle

{

private String name;

public Bus(){}

public Bus(String name){

super(name);

}

@Override

public abstract void run(){

System.out.println("Bus is running");

}

}

Car類(lèi):

public class Car extends Vehicle

{

private String name;

public Car(){}

public Car(String name){

super(name);

}

@Override

public abstract void run(){

System.out.println("Car is running");

}

}

靜態(tài)工廠類(lèi):

(靜態(tài)工廠創(chuàng)建一個(gè)對(duì)象,

靜態(tài)工廠創(chuàng)建的對(duì)象一般都有一個(gè)共同的特性,

繼承自某一個(gè)類(lèi),

或者引用一個(gè)接口)

public class StaticFactory{

public static Object getInstance(String className){

Object instance=null;

try{

Class c=Class.forName(className);

instance=c.newInstance();

}catch(Exception e){}

return instance;

}

public static Object getInstance(String className,Object ...args){

Class c=null;

try{

c=Class.forName(className);

}catch(Exception e){}

Constructor[] cons=c.getConstructors();

Object instance=null;

for(Constructor con:cons){

Class?[] cs=con.getParmeterTypes();

if(cs.length0){

boolean isConstructor=true;

for(int i=0;ics.length;i++){

Class t=cs[i];

if(!t.isInstance(args[i])){

isConstructor=false;

}

}

if(isConstructor){

try{

instance=con.newInstance(args);

break;

}catch(Exception e){}

}else{

continue;

}

}

}

return instance;

}

}

二、工廠方法模式:主要是對(duì)各類(lèi)東西分類(lèi)生產(chǎn),但分類(lèi)生產(chǎn)的對(duì)象仍然具有某一特性。

如果說(shuō)靜態(tài)工廠是一個(gè)綜合的交通工具建造工廠,

那么工廠方法模式就是具體分工,分成Bus與Car的工廠,

各自生產(chǎn)各自的產(chǎn)品,但是造出來(lái)的還是交通工具。

交通工具制造接口:

public interface VehicleMake{

/**制造交通工具**/

public Vehicle make();

}

Bus制造類(lèi):

public class BusMake implements VehicleMake{

@Override

public Vehicle make(){

Vehicle bus=new Bus();

System.out.println("Bus工廠制造了一輛Bus");

return bus;

}

}

Car制造類(lèi):

public class CarMake implements VehicleMake{

@Override

public Vehicle make(){

Vehicle car=new Car();

System.out.println("Car工廠制造了一輛Car");

return car;

}

}

三、抽象工廠模式:抽象工廠生產(chǎn)的對(duì)象可能是沒(méi)有共同特性的。比如,一個(gè)制造工廠BusMake不僅能制造Bus還能生產(chǎn)輪胎wheel等配件,Bus是交通工具,wheel是配件(代碼中有部分類(lèi)沒(méi)具體寫(xiě)出來(lái)只給了類(lèi)名)

總工廠(抽象工廠總接口):

public interface WheelVehicleMake extends VehicleMake{

/**制造輪胎**/

public Wheel makeWheel();

}

輪子BusMake:

public class WheelBusMake implements WheelVehicleMake{

@Override

public Vehicle make(){

Vehicle bus=new Bus();

System.out.println("WheelBusMake生產(chǎn)了一輛Bus");

return bus;

}

@Override

public Wheel makeWheel(){

Wheel busWheel=new BusWheel();

System.out.println("WheelBusMake生產(chǎn)了一個(gè)Bus輪子");

return busWheel;

}

}

輪子CarMake:

public class WheelCarMake implements WheelVehicleMake{

@Override

public Vehicle make(){

Vehicle car=new Car();

System.out.println("WheelCarMake生產(chǎn)了一輛Car");

return car;

}

@Override

public Wheel makeWheel(){

Wheel carWheel=new CarWheel();

System.out.println("WheelCarMake生產(chǎn)了一個(gè)Car輪子");

return carWheel;

}

}

求java工廠模式的一個(gè)簡(jiǎn)單代碼例子,盡量簡(jiǎn)單

這個(gè)應(yīng)該比較簡(jiǎn)單一點(diǎn)。

某系統(tǒng)日志記錄器要求支持多種日志記錄方式,如文件記錄、數(shù)據(jù)庫(kù)記錄等,且用戶可以根據(jù)要求動(dòng)態(tài)選擇日志記錄方式?,F(xiàn)使用工廠方法模式設(shè)計(jì)該系統(tǒng),并寫(xiě)出相應(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ù)庫(kù)記錄");

}

}

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文件,獲取工廠類(lèi)名

factory=new DatabaseLogFactory ();

log=factory.createLog();

log.writeLog();

}

catch(Exception e){

System.out.println(e.getMessage());

}

}

}

java工廠模式,懂的人進(jìn)

舉兩個(gè)例子以快速明白Java中的簡(jiǎn)單工廠模式:

女?huà)z摶土造人

話說(shuō):“天地開(kāi)辟,未有人民,女?huà)z摶土為人。”女?huà)z需要用土造出一個(gè)個(gè)的人,但在女?huà)z造出人之前,人的概念只存在于女?huà)z的思想里面。

女?huà)z造人,這就是簡(jiǎn)單工廠模式的應(yīng)用。

首先,在這個(gè)造人的思想里面,有幾個(gè)重要的角色:女?huà)z本身、抽象的人的概念和女?huà)z所造出的一個(gè)個(gè)具體的人。

1.)女?huà)z是一個(gè)工廠類(lèi),也就是簡(jiǎn)單工廠模式的核心角色。

2.)具休的一個(gè)個(gè)的人,包括張三,李四等。這些人便是簡(jiǎn)單工廠模式里面的具體產(chǎn)品角色

3.)抽象的人是最早只存在于女?huà)z的頭腦里的一個(gè)想法,女?huà)z按照這個(gè)想法造出的一個(gè)個(gè)具體的人,便都符合這個(gè)抽象的人的定義。換言之,這個(gè)抽象的想法規(guī)定了所有具體的人必須都有的接口(特征或者功能)

 其UML類(lèi)圖出下所示:

理解了上面的這些東西,再來(lái)理解下面的例子,對(duì)照理解,相信看完這篇文章,便對(duì)java簡(jiǎn)單工廠模式有一個(gè)很好的理解:

有一個(gè)農(nóng)場(chǎng)公司,專(zhuān)門(mén)向市場(chǎng)銷(xiāo)售各類(lèi)水果,在這個(gè)系統(tǒng)里需要描述下列水果:

 葡萄 Grape

 草莓 Stuawberry

 蘋(píng)果 Apple

水果與其他植物不同,最終可以采摘食用,那么一個(gè)自然的做法是建立一個(gè)各種水果都適用的接口,以便與其他農(nóng)場(chǎng)里的植物區(qū)分開(kāi)來(lái),

此時(shí),則是為水果類(lèi)聲明了一個(gè)接口,表現(xiàn)在代碼上:

1 public interface Fruit {

2 // 生長(zhǎng)

3 void grow();

4 // 收獲

5 void harvest();

6 // 種植

7 void plant();

8 }

9

10

水果接口規(guī)定出所有的水果必須實(shí)現(xiàn)的接口,包括任何水果類(lèi)必須具備的方法plant(),grow(),和harvest();

Apple類(lèi)是水果類(lèi)的一種,因此它實(shí)現(xiàn)了水果接口所聲明的所有方法。另處,由于蘋(píng)果是多年生植物,因此多出一個(gè)treeAge性質(zhì),描述蘋(píng)果的樹(shù)齡。代碼如下所示:

package fac;

public class Apple implements Fruit { // 通過(guò)implements實(shí)現(xiàn)接口Fruit

private int treeAge;

public void grow() {

log( " Apple is growing " );

}

public void harvest() {

log( " Apple has been harvested " );

}

public void plant() {

log( " Apple ha been planted " );

}

public static void log(String msg) {

System.out.println(msg);

}

public int getTreeAge() {

return treeAge;

}

public void setTreeAge( int treeAge) {

this .treeAge = treeAge;

}

}

同理,葡萄 Grape:

package fac;

public class Grape implements Fruit{

private boolean seedless;

public void grow(){

log("Grape is growing.");

}

public void harvest(){

log("Grape has been harvested");

}

public void plant(){

log("Grape ha been planted");

}

public static void log(String msg){

System.out.println(msg);

}

public boolean isSeedless() {

return seedless;

}

public void setSeedless(boolean seedless) {

this.seedless = seedless;

}

}

草莓 Stuawberry:

package fac;

public class Strawberry implements Fruit{

public void grow(){

log("Strawberry is growing");

}

public void harvest(){

log("Strawberry has been harvested");

}

public void plant(){

log("Strawberry has been planted");

}

public static void log(String msg){

System.out.println(msg);

}

}

農(nóng)場(chǎng)園丁也是系統(tǒng)的一部分,由一個(gè)類(lèi)來(lái)代表,F(xiàn)ruitGardener類(lèi),代碼如下:

package fac;

public class FruitGardener{

public static Fruit factory(String which)throws Exception{

if(which.equalsIgnoreCase("apple")){

return new Apple();

}else if(which.equalsIgnoreCase("strawberry")){

return new Strawberry();

}else if (which.equalsIgnoreCase("grape")){

return new Grape();

}else{

throw new Exception("Bad fruit request");

}

}

}

這時(shí)有人來(lái)果園玩,和園丁說(shuō),給我們介紹下你的水果吧。于是園?。?/p>

package fac;

public class People {

public static void main(String[] args) throws Exception {

FruitGardener fg=new FruitGardener();

Fruit ap=fg.factory("Apple");

ap.grow();

Fruit gp=fg.factory("Grape");

gp.plant();

Fruit dd=fg.factory("ddd");//拋出Bad fruit request異常

}

}

(注:以上代碼在JDK5.0,Myeclise3.2下編譯通過(guò))

類(lèi)比兩個(gè)例子,園丁就相當(dāng)于女?huà)z,而水果就相當(dāng)于具體的人,接口水果類(lèi)就相當(dāng)于存在于類(lèi)女?huà)z思想里的人的抽象概念。

由以上兩個(gè)例子可得出,簡(jiǎn)單工廠模式需要由以下角色組成:

接口

接口的實(shí)現(xiàn)類(lèi)(簡(jiǎn)單工廠模式里面的具體產(chǎn)品角色)

工廠

理解了以下兩個(gè)例子,再來(lái)看第三個(gè)例子:

注意對(duì)比以下三個(gè)實(shí)例的不同

實(shí)例1:

package org.jzkangta.factorydemo01;

//定義接口

interface Car{

public void run();

public void stop();

}

//具體實(shí)現(xiàn)類(lèi)

class Benz implements Car{

public void run(){

System.out.println("Benz開(kāi)始啟動(dòng)了。。。。。");

}

public void stop(){

System.out.println("Benz停車(chē)了。。。。。");

}

}

//具體實(shí)現(xiàn)類(lèi)

class Ford implements Car{

public void run(){

System.out.println("Ford開(kāi)始啟動(dòng)了。。。");

}

public void stop(){

System.out.println("Ford停車(chē)了。。。。");

}

}

//工廠

class Factory{

public static Car getCarInstance(){

return new Ford();

}

}

public class FactoryDemo01 {

public static void main(String[] args) {

Car c=Factory.getCarInstance();

c.run();

c.stop();

}

}

實(shí)例二:

package fac;

//定義接口

interface Car{

public void run();

public void stop();

}

//具體實(shí)現(xiàn)類(lèi)

class Benz implements Car{

public void run(){

System.out.println("Benz開(kāi)始啟動(dòng)了。。。。。");

}

public void stop(){

System.out.println("Benz停車(chē)了。。。。。");

}

}

class Ford implements Car{

public void run(){

System.out.println("Ford開(kāi)始啟動(dòng)了。。。");

}

public void stop(){

System.out.println("Ford停車(chē)了。。。。");

}

}

//工廠

class Factory{

public static Car getCarInstance(String type){

Car c=null;

if("Benz".equals(type)){

c=new Benz();

}

if("Ford".equals(type)){

c=new Ford();

}

return c;

}

}

public class FactoryDemo02 {

public static void main(String[] args) {

Car c=Factory.getCarInstance("Benz");

if(c!=null){

c.run();

c.stop();

}else{

System.out.println("造不了這種汽車(chē)。。。");

}

}

}

實(shí)例三:

interface Car{

public void run();

public void stop();

}

class Benz implements Car{

public void run(){

System.out.println("Benz開(kāi)始啟動(dòng)了。。。。。");

}

public void stop(){

System.out.println("Benz停車(chē)了。。。。。");

}

}

class Ford implements Car{

public void run(){

System.out.println("Ford開(kāi)始啟動(dòng)了。。。");

}

public void stop(){

System.out.println("Ford停車(chē)了。。。。");

}

}

class Toyota implements Car{

public void run(){

System.out.println("Toyota開(kāi)始啟動(dòng)了。。。");

}

public void stop(){

System.out.println("Toyota停車(chē)了。。。。");

}

}

class Factory{

public static Car getCarInstance(String type){

Car c=null;

try {

c=(Car)Class.forName("org.jzkangta.factorydemo03."+type).newInstance();//利用反射得到汽車(chē)類(lèi)型 

} 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 c;

}

}

public class FactoryDemo03 {

public static void main(String[] args) {

Car c=Factory.getCarInstance("Toyota");

if(c!=null){

c.run();

c.stop();

}else{

System.out.println("造不了這種汽車(chē)。。。");

}

}

}

對(duì)比三個(gè)實(shí)例:

實(shí)例一,雖然實(shí)現(xiàn)了簡(jiǎn)單工廠,但每次只能得到一種汽車(chē),如果我們想換一種,就得修改工廠,太不方便,而實(shí)例二則改變了這種情況,便得我們可以按照我們的需要更換汽車(chē),但我們所更換的汽車(chē)必須是實(shí)現(xiàn)類(lèi)中有的,如果我們想要增加一種汽車(chē)的時(shí)候,我們還是得更改工廠,通過(guò)改進(jìn),實(shí)例三利用反射機(jī)制,得到汽車(chē)類(lèi)型,這樣當(dāng)我們需要增加一種新的汽車(chē)時(shí),就無(wú)需要再修改工廠,而只需要增加要實(shí)現(xiàn)的類(lèi)即可。也就是說(shuō)要增加什么樣的汽車(chē)直接增加這個(gè)汽車(chē)的類(lèi)即可,而無(wú)需改變工廠。從而達(dá)到了工廠分離的效果。

用java 編寫(xiě)程序?qū)懗龊?jiǎn)單的工廠模式?

java中工廠模式分為:

簡(jiǎn)單工廠模式(Simple Factory)?

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

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

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

提供一個(gè)簡(jiǎ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{

/*

* 可愛(ài)型女人

*/

public LovelinessWoman()

{

String mySkill="撒過(guò)嬌、出過(guò)軌、勾引領(lǐng)導(dǎo)下過(guò)水";

? this.setMySkill(mySkill);

}

}

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

public class SteelinessWoman extends Woman{

/*

* 冷酷型女人

*/

public SteelinessWoman()

{

String mySkill="裝過(guò)神、弄過(guò)鬼,跟別人老公親過(guò)嘴";

? 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("請(qǐng)選擇你要找的女人的類(lèi)型");

System.out.println("LovelinessWoman:可愛(ài)型女人 VirtuousWoman:善良型女人 SteelinessWoman:冷酷型女人");

String typeid=input.next();

? ? ? ?WomanMakeFactory factory = new WomanMakeFactory();

? ? ? ?Woman wm=factory.findWoman(typeid);

? ? ? ?System.out.println("該類(lèi)型女人的新標(biāo)準(zhǔn):");

? ? ? ?System.out.println(wm.getMySkill());

? ? ?

? ? ? ?System.out.println("還想看看別的類(lèi)型嗎?y代表想,n代表再也不想了");

? ? ?

? ? ? ?sel=input.next().equals("y");

} while (sel);

}

}

分享文章:java工廠模式代碼實(shí)現(xiàn) java設(shè)計(jì)模式之工廠模式
文章分享:http://chinadenli.net/article22/dodipjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、標(biāo)簽優(yōu)化、定制開(kāi)發(fā)、靜態(tài)網(wǎng)站、虛擬主機(jī)網(wǎng)站營(yíng)銷(xiāo)

廣告

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

成都網(wǎng)頁(yè)設(shè)計(jì)公司