最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章帶你入門java工廠模式

 更新時間:2021年08月09日 14:58:49   作者:zsr6135  
這篇文章主要介紹了Java工廠模式,結(jié)合實例形式詳細分析了java基本數(shù)據(jù)類型、數(shù)據(jù)類型轉(zhuǎn)換、算術(shù)運算符、邏輯運算符等相關(guān)原理與操作技巧,需要的朋友可以參考下

Java設(shè)計模式-工廠模式

什么是工廠模式?

工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。

在工廠模式中,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象。

簡單編寫一個類:

1、簡單工廠模式

本程序非常簡單就是通過接口的子類為接口對象實例化,但是本操作存在什么樣的問題呢?

之前一直在強調(diào),主方法或者是主類是一個客戶端,客戶端的操作應(yīng)該越簡單越好。但是在現(xiàn)在的程序之中,有一個最大的問題:客戶端之中,一個接口和一個固定的子類綁在一起了。

在本程序之中,最大的問題在于耦合上,發(fā)現(xiàn)在主方法之中一個接口和一個子類緊密耦合在一起,這種方法比較直接,可以簡單的理解為:A→B,但是這種緊密的方式不方便于維護,所以后來使用了A→B→C,中間經(jīng)歷了一個過渡,這樣一來B去改變,C去改變,但是A不需要改變,就好比JAVA的JVM一樣:程序→JVM→操作系統(tǒng)。

2、普通工廠模式 UML圖:

源代碼:

ProjectFactory.java

public interface ProjectFactory {
	Project getname();
}

BlueFactory.java(ConcreteFactory1)

public class BlueFactory implements ProjectFactory{
	@Override
	public Project getname() {
		// TODO Auto-generated method stub
		return new Bluepen();
	}
}

RedFactory.java(ConcreteFactory2)

public class RedFactory implements ProjectFactory{
	@Override
	public Project getname() {
		// TODO Auto-generated method stub
		return new redPen();
	}
}

Project.java(產(chǎn)品類)

public interface Project {
	void name();
}

Bluepen.java(ConcreteProject1)

public class Bluepen implements Project{
	@Override
	public void name() {
		// TODO Auto-generated method stub
		System.out.println("這是一個藍色的筆");
	}
}

RedFactory.java(ConcreteProject2)

public class RedFactory implements ProjectFactory{
	@Override
	public Project getname() {
		// TODO Auto-generated method stub
		return new redPen();
	}
}

測試類

public class Client {
	public static void main(String[] args) {
		Project pen = new RedFactory().getname();
		pen.name();
		Project pen1 = new BlueFactory().getname();
		pen1.name();
	}
}

運行結(jié)果:

image-20210805205221818

這個時候發(fā)現(xiàn)客戶端不在和一個具體的子類耦合在一起了,就算以后增加了新的子類,那么也只需要修改Factory類即可。

小結(jié):

  • 以后如果是自己編寫的接口如果想要取得接口的 實例化對象,第一反應(yīng)寫工廠類
  • 簡單工廠和工廠方法模式的不同在于前者生成產(chǎn)生產(chǎn)品的行為封裝在一個方法中,根據(jù)參數(shù)的類型進行實例化,同時不存在抽象接口。而后者則增加了抽象工廠,通過實現(xiàn)不同的工廠方法來創(chuàng)建不同的產(chǎn)品,一個方法通常對應(yīng)一個產(chǎn)品,這種方式相較于前者擴展性更高,在需求增加時完全符合開閉原則和依賴倒置原則

使用場景:

消費者不關(guān)心它所要創(chuàng)建對象的類(產(chǎn)品類)的時候。

消費者知道它所要創(chuàng)建對象的類(產(chǎn)品類),但不關(guān)心如何創(chuàng)建的時候。

例如:hibernate里通過sessionFactory創(chuàng)建session、通過代理方式生成ws客戶端時,通過工廠構(gòu)建報文中格式化數(shù)據(jù)的對象。

3、抽象工廠模式

定義:為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個接口,而且無需指定他們的具體類。

抽象工廠模式與工廠方法模式的區(qū)別

​ 抽象工廠模式是工廠方法模式的升級版本,他用來創(chuàng)建一組相關(guān)或者相互依賴的對象。他與工廠方法模式的區(qū)別就在于,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu);而抽象工廠模式則是針對的多個產(chǎn)品等級結(jié)構(gòu)。在編程中,通常一個產(chǎn)品結(jié)構(gòu),表現(xiàn)為一個接口或者抽象類,也就是說,工廠方法模式提供的所有產(chǎn)品都是衍生自同一個接口或抽象類,而抽象工廠模式所提供的產(chǎn)品則是衍生自不同的接口或抽象類。

​ 在抽象工廠模式中,有一個產(chǎn)品族的概念:所謂的產(chǎn)品族,是指位于不同產(chǎn)品等級結(jié)構(gòu)中功能相關(guān)聯(lián)的產(chǎn)品組成的家族。抽象工廠模式所提供的一系列產(chǎn)品就組成一個產(chǎn)品族;而工廠方法提供的一系列產(chǎn)品稱為一個等級結(jié)構(gòu)。.

如果工廠的產(chǎn)品全部屬于同一個等級結(jié)構(gòu),則屬于工廠方法模式;如果工廠的產(chǎn)品來自多個等級結(jié)構(gòu),則屬于抽象工廠模式。

UML圖:

image-20210805210243478

源代碼:

Factory.java(抽象工廠)

public interface Factory {
	PhoneProject projectPhone();
	LaptopProject projectLaptop();
}

HuaWeiFactory.java(華為具體工廠)

public class HuaWeiFactory implements Factory{
	@Override
	public PhoneProject projectPhone() {
		// TODO Auto-generated method stub
		return new HuaWeiPhone();
	}
	@Override
	public LaptopProject projectLaptop() {
		// TODO Auto-generated method stub
		return new HuaWeiLaptop();
	}
}

XiaomiFactory.java(小米具體工廠)

public class XiaomiFactory implements Factory{
	@Override
	public PhoneProject projectPhone() {
		// TODO Auto-generated method stub
		return new XiaomiPhone();
	}
	@Override
	public LaptopProject projectLaptop() {
		// TODO Auto-generated method stub
		return new XiaomiLaptop();
	}
}

LaptopProject.java(筆記本產(chǎn)品)

public interface LaptopProject {
	void getId();
	void printInfo();
}

HuaWeiLaptop.java(華為筆記本)

public class HuaWeiLaptop implements LaptopProject{
	@Override
	public void getId() {
		// TODO Auto-generated method stub
		System.out.println("編號"+123);
	}
	@Override
	public void printInfo() {
		// TODO Auto-generated method stub
		System.out.println("生產(chǎn)了華為電腦");
	}
}

XiaomiLaptop.java(小米筆記本)

public class XiaomiLaptop implements LaptopProject{
	@Override
	public void getId() {
		// TODO Auto-generated method stub
		System.out.println("編號"+213);
	}
	@Override
	public void printInfo() {
		// TODO Auto-generated method stub
		System.out.println("生產(chǎn)小米電腦");
	}
}

PhoneProject.java(手機產(chǎn)品)

public interface PhoneProject {
	void getId();
	void printInfo();
}

HuaWeiPhone.java(華為手機)

public class HuaWeiPhone implements PhoneProject{
	@Override
	public void getId() {
		// TODO Auto-generated method stub
		System.out.println("編號:"+123412);
	}
	@Override
	public void printInfo() {
		// TODO Auto-generated method stub
		System.out.println("生產(chǎn)華為手機");
	}
}

XiaomiPhone.java(小米手機)

public class XiaomiPhone implements PhoneProject{
	@Override
	public void getId() {
		// TODO Auto-generated method stub
		System.out.println("編號:"+123412);
	}
	@Override
	public void printInfo() {
		// TODO Auto-generated method stub
		System.out.println("生產(chǎn)了小米手機?。?);
	}
}

測試類:

public class Client {
	public static void main(String[] args) {
		PhoneProject huawei = new HuaWeiFactory().projectPhone();
		huawei.printInfo();
		huawei.getId();
		PhoneProject xiaomi = new XiaomiFactory().projectPhone();
		xiaomi.printInfo();
		LaptopProject huawei1 = new HuaWeiFactory().projectLaptop();
		huawei1.printInfo();
	}
}

運行結(jié)果:

image-20210805211054410

總結(jié):

抽象工廠模式是工廠方法模式的升級版,后者面向單個產(chǎn)品,而前者面向的的是一個產(chǎn)品族。根據(jù)官方定義:為創(chuàng)建一組相關(guān)/互相依賴的對象提供一個接口而無需指定它們的具體類。
比如一個汽車工廠要生成騎車,而每種汽車都有車門、車輪胎等一系列產(chǎn)品,這意味著每增加一款汽車就需要增加一個新的工廠來提供新產(chǎn)品的實現(xiàn)。這時候就可以使用抽象工廠模式來進行設(shè)計。抽象工廠模式適用于一系列產(chǎn)品族。

優(yōu)點: 抽象廠模式將產(chǎn)品族的依賴與約束關(guān)系放到抽象工廠中,便于管理。職責解耦,用戶不需要關(guān)心一堆自己不關(guān)心的細節(jié),由抽象廠來負責組件的創(chuàng)建切換產(chǎn)品族容易,只需要增加一個具體工廠實現(xiàn),客戶端選擇另-個套餐就可以了 缺點: 抽象工廠模式類增加的速度很快,有一個產(chǎn)品族就需要增加一一個具體工廠實現(xiàn),比較繁瑣產(chǎn)品族難以擴展產(chǎn)品。當產(chǎn)品族中增加一個產(chǎn)品時,抽象工廠接口中需要增加一個函數(shù),對應(yīng)的所有具體工廠實現(xiàn)都需要修改,修改放大嚴重。抽象廠并未完全屏蔽創(chuàng)建細節(jié),給出的都是組件。對于這種情況可以結(jié)合工廠模式或簡單工廠模式-起使用。 使用場景:

大家應(yīng)該已經(jīng)發(fā)現(xiàn)了,其實抽象工廠模式如果只有一個組件的話,其實是退化到工廠方法模式,也就是沒有了產(chǎn)品族的概念,只剩一一個產(chǎn)品了,因此簡單工廠,廠方法,抽象工廠這三者之間是有內(nèi)在聯(lián)系的,區(qū)別只產(chǎn)品的復(fù)雜度。抽象工廠的本質(zhì)是選擇產(chǎn)品族,因此大家可以根據(jù)這個特征來識別是否可以應(yīng)用抽象廠。

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java StringBuilder類原理及常用方法

    Java StringBuilder類原理及常用方法

    這篇文章主要介紹了Java StringBuilder類原理及常用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Spring高級注解之@DependsOn詳解

    Spring高級注解之@DependsOn詳解

    這篇文章主要介紹了Spring高級注解之@DependsOn詳解,@DependsOn注解可以定義在類和方法上,意思是我這個組件要依賴于另一個組件,也就是說被依賴的組件會比該組件先注冊到IOC容器中,需要的朋友可以參考下
    2024-01-01
  • 在MyBatis中實現(xiàn)一對多查詢和多對一查詢的方式詳解(各兩種方式)

    在MyBatis中實現(xiàn)一對多查詢和多對一查詢的方式詳解(各兩種方式)

    今天通過兩種方法分別給大家介紹在MyBatis中實現(xiàn)一對多查詢和多對一查詢的方式,每種方式通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2022-01-01
  • Java必會的Synchronized底層原理剖析

    Java必會的Synchronized底層原理剖析

    synchronized作為Java程序員最常用同步工具,很多人卻對它的用法和實現(xiàn)原理一知半解,以至于還有不少人認為synchronized是重量級鎖,性能較差,盡量少用。但不可否認的是synchronized依然是并發(fā)首選工具,本文就來詳細講講
    2022-10-10
  • java排查進程占用系統(tǒng)內(nèi)存高方法

    java排查進程占用系統(tǒng)內(nèi)存高方法

    這篇文章主要為大家介紹了java進程占用系統(tǒng)內(nèi)存高排查方法,
    2023-06-06
  • java實現(xiàn)數(shù)字轉(zhuǎn)大寫的方法

    java實現(xiàn)數(shù)字轉(zhuǎn)大寫的方法

    這篇文章主要介紹了 java實現(xiàn)數(shù)字轉(zhuǎn)大寫的方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • Java全局異常處理器實現(xiàn)過程解析

    Java全局異常處理器實現(xiàn)過程解析

    這篇文章主要介紹了Java全局異常處理器實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Springboot整合thymleaf模板引擎過程解析

    Springboot整合thymleaf模板引擎過程解析

    這篇文章主要介紹了Springboot整合thymleaf模板引擎過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Spring定時任務(wù)實現(xiàn)與配置(一)

    Spring定時任務(wù)實現(xiàn)與配置(一)

    這篇文章主要為大家詳細介紹了Spring定時任務(wù)的實現(xiàn)與配置第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java如何實現(xiàn)抽取json文件指定字段值

    java如何實現(xiàn)抽取json文件指定字段值

    這篇文章主要介紹了java如何實現(xiàn)抽取json文件指定字段值,具有很好的參考價值,希望對大家有所幫助。
    2022-06-06

最新評論

湘潭市| 西乌珠穆沁旗| 鄂伦春自治旗| 灵川县| 温宿县| 顺平县| 云浮市| 和平县| 乐东| 云霄县| 嘉峪关市| 穆棱市| 连平县| 台前县| 健康| 子长县| 松江区| 开封县| 稻城县| 富民县| 贺兰县| 买车| 南和县| 西乌| 凤山市| 印江| 剑阁县| 江安县| 南汇区| 甘肃省| 石首市| 宁国市| 青龙| 新干县| 南城县| 屯留县| 绥阳县| 开平市| 哈巴河县| 崇义县| 六安市|