Java创新型模式_java设计模式--创建型模式(一)
2016-04-24 10:10:34
創(chuàng)建型模式:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式
注意:工廠模式可以分為三類:?1)簡單工廠模式(Simple Factory)?2)工廠方法模式(Factory Method) 3)抽象工廠模式(Abstract Factory)
這三種模式從上到下逐步抽象,并且更具一般性。
而GOF在《設(shè)計(jì)模式》一書中將工廠模式分為兩類:工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory),這是將簡單工廠模式(Simple Factory)看成了工廠方法模式的一種特例,兩者歸為了一類。
工廠方法模式:
(1)簡單工廠模式(又叫靜態(tài)工廠方法模式)
通過專門定義一個(gè)類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。
模式中包含的角色及其職責(zé):
1.工廠(Creator)角色
簡單工廠模式的核心,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象。
2.抽象(Product)角色
簡單工廠模式所創(chuàng)建的所有對象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
3.具體產(chǎn)品(Concrete Product)角色
簡單工廠模式所創(chuàng)建的具體實(shí)例對象
例子:采集水果,如蘋果、香蕉
Apple和Banana是具體產(chǎn)品角色;Fruit是抽象角色,是Apple和Banana的公共接口;FruitFactory是工廠角色,負(fù)責(zé)創(chuàng)建Apple和Banana實(shí)例。
public interfaceFruit {/** 采集*/
public voidget();
}
public class Apple implementsFruit{/** 采集*/
public voidget(){
System.out.println("采集蘋果");
}
}
public class Banana implementsFruit{/** 采集*/
public voidget(){
System.out.println("采集香蕉");
}
public classFruitFactory {/** 獲得Apple類的實(shí)例*/
public staticFruit getApple() {return newApple();
}/** 獲得Banana類實(shí)例*/
public staticFruit getBanana() {return newBanana();
}
}
public classMainClass {public static voidmain(String[] args) {
Fruit apple=FruitFactory.getApple();
Fruit banana=FruitFactory.getBanana();
apple.get();
banana.get();
}
還可以如下修改FruitFactory類
public classFruitFactory {/** getFruit方法,獲得所有產(chǎn)品對象*/
public static Fruit getFruit(String type) throwsInstantiationException, IllegalAccessException, ClassNotFoundException {
Class fruit=Class.forName(type);return(Fruit) fruit.newInstance();
}
}
這樣動態(tài)的加載和創(chuàng)建Class類,但是沒有注意大小寫;
進(jìn)一步修改為:
public classFruitFactory {/** getFruit方法,獲得所有產(chǎn)品對象*/
public static Fruit getFruit(String type) throwsInstantiationException, IllegalAccessException, ClassNotFoundException {if(type.equalsIgnoreCase("apple")) {return Apple.class.newInstance();
}else if(type.equalsIgnoreCase("banana")) {return Banana.class.newInstance();
}else{
System.out.println("找不到相應(yīng)的實(shí)例化類");return null;
}
}
}
然后
public classMainClass {public static void main(String[] args) throwsInstantiationException, IllegalAccessException, ClassNotFoundException {
Fruit apple= FruitFactory.getFruit("Apple");
Fruit banana= FruitFactory.getFruit("Banana");
apple.get();
banana.get();
}
}
簡單工廠模式的優(yōu)缺點(diǎn):
在這個(gè)模式中,工廠類是整個(gè)模式的關(guān)鍵所在。它包含必要的判斷邏輯,能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對象。用戶在使用時(shí)可以直接根據(jù)工廠類去創(chuàng)建所需的實(shí)例,而無需了解這些對象是如何創(chuàng)建以及如何組織的。有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。
不難發(fā)現(xiàn),簡單工廠模式的缺點(diǎn)也正體現(xiàn)在其工廠類上,由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,所以“高內(nèi)聚”方面做的并不好。另外,當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時(shí),可能會出現(xiàn)要求工廠類也要做相應(yīng)的修改,擴(kuò)展性并不很好。例如增加一種水果-梨子,需要在FruitFactory中繼續(xù)增加else if語句,不符合開放封閉原則。這時(shí)候考慮下面的工廠方法模式。
(2)工廠方法模式(又叫多態(tài)工廠模式)
工廠方法模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。
模式中包含的角色及其職責(zé):
1.抽象工廠(Creator)角色
工廠方法模式的核心,任何工廠類都必須實(shí)現(xiàn)這個(gè)接口。
2.具體工廠( Concrete
Creator)角色
具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn),負(fù)責(zé)實(shí)例化產(chǎn)品對象。
3.抽象(Product)角色
工廠方法模式所創(chuàng)建的所有對象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
4.具體產(chǎn)品(Concrete Product)角色
工廠方法模式所創(chuàng)建的具體實(shí)例對象
例子:采集水果,如蘋果、香蕉、梨子
Apple、Banana、Pear是具體產(chǎn)品角色;Fruit是抽象角色,是Apple、Banana、Pear的公共接口。他們的構(gòu)造和前面簡單工廠模式中一樣。
AppleFactory、BananaFactory、PearFactory是具體工廠角色,負(fù)責(zé)創(chuàng)建Apple、Banana、Pear的實(shí)例;FruitFactory是抽象工廠角色,是AppleFactory、BananaFactory、PearFactory的公共接口。
public interfaceFruitFactory {//水果廠
publicFruit getFruit();
}
public class AppleFactory implementsFruitFactory {//蘋果廠,返回蘋果實(shí)例
publicFruit getFruit() {return newApple();
}
}
public class BananaFactory implementsFruitFactory {//香蕉廠,返回香蕉實(shí)例
publicFruit getFruit() {return newBanana();
}
}
public class PearFactory implementsFruitFactory {//梨子廠,返回梨子實(shí)例
publicFruit getFruit() {return newPear();
}
}
public classMainClass {public static voidmain(String[] args) {//獲得AppleFactory
FruitFactory ff = newAppleFactory();//通過AppleFactory來獲得Apple實(shí)例對象
Fruit apple =ff.getApple();
apple.get();//獲得BananaFactory
FruitFactory ff2 = newBananaFactory();//通過BananaFactory來獲得Banana實(shí)例對象
Fruit banana =ff2.getBanana();
banana.get();//獲得PearFactory
FruitFactory ff3 = newPearFactory();//通過PearFactory來獲得Pear實(shí)例對象
Fruit pear =ff3.getPear();
pear.get();
}
}
和簡單工廠模式比較:工廠方法類的核心是一個(gè)抽象工廠類,而簡單工廠模式把核心放在一個(gè)具體類上。
工廠方法模式之所以有一個(gè)別名叫多態(tài)性工廠模式是因?yàn)榫唧w工廠類都有共同的接口,或者有共同的抽象父類。
當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對象時(shí),僅僅需要添加一個(gè)具體對象以及一個(gè)具體工廠對象,原有工廠對象不需要進(jìn)行任何修改,也不需要修改客戶端,很好的符合了“開放-封閉”原則。而簡單工廠模式在添加新產(chǎn)品對象后不得不修改工廠方法,擴(kuò)展性不好。工廠方法模式退化后可以演變成簡單工廠模式。
抽象工廠模式
抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向客戶端提供一個(gè)接口,使得客戶端在不必指定產(chǎn)品的具體類型的情況下,能夠創(chuàng)建多個(gè)產(chǎn)品族的產(chǎn)品對象。
Apple、Pear屬于產(chǎn)品等級結(jié)構(gòu);Apple又分南方Apple和北方Apple;Pear也分南方Pear和北方Pear。
一個(gè)工廠負(fù)責(zé)生產(chǎn)南方的Apple、Pear,這是一個(gè)產(chǎn)品族;一個(gè)工廠負(fù)責(zé)生產(chǎn)北方的Apple、Pear,這是另一個(gè)產(chǎn)品族。
模式中包含的角色及其職責(zé):
1.抽象工廠(Creator)角色
抽象工廠模式的核心,包含對多個(gè)產(chǎn)品結(jié)構(gòu)的聲明,任何工廠類都必須實(shí)現(xiàn)這個(gè)接口。
2.具體工廠( Concrete? Creator)角色
具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn),負(fù)責(zé)實(shí)例化某個(gè)產(chǎn)品族中的產(chǎn)品對象。
3.抽象(Product)角色
抽象模式所創(chuàng)建的所有對象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
4.具體產(chǎn)品(Concrete Product)角色
抽象模式所創(chuàng)建的具體實(shí)例對象
注意:抽象工廠中方法對應(yīng)產(chǎn)品結(jié)構(gòu),具體工廠對應(yīng)產(chǎn)品族。
FruitFactory是抽象工廠角色,里面聲明了蘋果和梨子;SouthFactory和NorthFactory是具體工廠角色,SouthFactory返回南方蘋果和梨子實(shí)例,NorthFactory返回北方蘋果和梨子實(shí)例。
public interfaceFruit {/** 采集*/
public voidget();
}
public abstract class Apple implementsFruit{/** 采集蘋果*/
public abstract voidget();
}
public abstract class Pear implementsFruit{/** 采集梨子*/
public abstract voidget();
}
public class SouthApple extendsApple {public voidget() {
System.out.println("采集南方蘋果");
}
}
public class NorthApple extendsApple {public voidget() {
System.out.println("采集北方蘋果");
}
}
public class SouthPear extendsPear {public voidget() {
System.out.println("采集南方梨子");
}
}
public class NorthPear extendsPear {public voidget() {
System.out.println("采集北方梨子");
}
}
public interfaceFruitFactory {//實(shí)例化Apple
publicFruit getApple();//實(shí)例化Pear
publicFruit getPear();
}
public class SouthFruitFactory implementsFruitFactory {publicFruit getApple() {return newSouthApple();
}publicFruit getPear() {return newSouthPear();
}
}
public class NorthFruitFactory implementsFruitFactory {publicFruit getApple() {return newNorthApple();
}publicFruit getPear() {return newNorthPear();
}
}
public classMainClass {public static voidmain(String[] args) {
FruitFactory ff= newNorthFruitFactory();
Fruit apple=ff.getApple();
apple.get();
Fruit banana=ff.getPear();
pear.get();
FruitFactory ff2= newSouthFruitFactory();
Fruit apple2=ff2.getApple();
apple2.get();
Fruit banana2=ff2.getPear();
pear2.get();
}
}
如果再增加一個(gè)產(chǎn)品族:溫室水果,包括溫室蘋果和溫室梨子,只要增加相應(yīng)的溫室蘋果類、溫室梨子類和溫室工廠類,符合“開放-封閉“”原則。但是若增加的是一個(gè)產(chǎn)品,如香蕉,則會違反該原則。
補(bǔ)充:工廠模式在開發(fā)中的應(yīng)用
一個(gè)簡單的計(jì)算器(主要是加法運(yùn)算):
OperationFactory是抽象工廠類,AddOperationFactory是具體工廠類;Operation是抽象角色類;AddOperation和SubtractionOperation是具體角色類。
public abstract classOperation {private doublenum1;private doublenum2;public doublegetNum1() {returnnum1;
}public void setNum1(doublenum1) {this.num1 =num1;
}public doublegetNum2() {returnnum2;
}public void setNum2(doublenum2) {this.num2 =num2;
}public abstract doublegetResult();
}
public class AddOperation extendsOperation {public doublegetResult() {double result = this.getNum1() + this.getNum2();returnresult;
}
}
public class SubtractionOperation extendsOperation {public doublegetResult() {double result = this.getNum1() - this.getNum2();returnresult;
}
}
public interfaceOperationFactory {publicOperation getOperation();
}
public class AddOperationFactory implementsOperationFactory{publicOperation getOperation() {return newAddOperation();
}
}
importjava.util.Scanner;public classMainClass {public static voidmain(String[] args) {//1.接受控制臺輸入
System.out.println("---計(jì)算器程序---");
System.out.println("輸入第一個(gè)操作數(shù)");
Scanner scanner= newScanner(System.in);
String strNum1=scanner.nextLine();
System.out.println("輸入運(yùn)算符");
String oper=scanner.nextLine();
System.out.println("輸入第二個(gè)操作數(shù)");
String strNum2=scanner.nextLine();double result = 0;double num1 =Double.parseDouble(strNum1);double num2 =Double.parseDouble(strNum2);//2.進(jìn)行運(yùn)算
if("+".equals(oper)) {
OperationFactory factory= newAddOperationFactory();
Operation operation=factory.getOperation();
operation.setNum1(num1);
operation.setNum2(num2);
result=operation.getResult();
}//3.返回結(jié)果
System.out.println(strNum1 + oper + strNum2 + "=" +result);
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Java创新型模式_java设计模式--创建型模式(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多点app如何更换门店(汉典多字的基本解
- 下一篇: java count 在哪一类里_jav