工廠模式是我們最常用的實例化對象模式了杖虾,是用工廠方法代替new操作的一種模式。
著名的Jive論壇 ,就大量使用了工廠模式精盅,工廠模式在Java程序系統(tǒng)可以說是隨處可見帽哑。因為工廠模式就相當于創(chuàng)建實例對象的new,我們經(jīng)常要根據(jù)類Class生成實例對象渤弛,如A a=new A() 祝拯;
工廠模式也是用來創(chuàng)建實例對象的且具有更大的可擴展性和盡量少的修改量。
工廠模式定義
【通常我們都要在創(chuàng)建sample實例時一般是用new ,但是如果創(chuàng)建對象的同時要進行初始化的工作,且不是簡單賦值 她肯,查詢數(shù)據(jù)庫佳头,是有很長一段代碼操作,new 中的構造函數(shù)是沒辦法滿足晴氨。如果非寫入構造函數(shù)中康嘉,也是有悖于Java[面向對象的原則,但是如果利用工廠模式籽前,將代碼“封裝”起來(減少段和段之間耦合聯(lián)系性)亭珍,這樣會降低代碼耦合 提高代碼服用≈澹】
下面例子中鼠標肄梨,鍵盤,耳麥為產(chǎn)品挠锥,惠普众羡,戴爾為工廠。
1.簡單工廠模式
簡單工廠模式:簡而言之蓖租,就是有一個專門生產(chǎn)某個產(chǎn)品的類粱侣。
比如下圖中的鼠標工廠,專業(yè)生產(chǎn)鼠標蓖宦,給參數(shù) 0齐婴,生產(chǎn)戴爾鼠標,給參數(shù) 1稠茂,生產(chǎn)惠普鼠標柠偶。
/** @create: 2020-02-15 22:20
* 簡單工廠模式
**/
public class SimpleFactory {
public static void main(String[] args) {
Car car1 = (Car)Factory.get("奧迪");
car1.create();
Car car2 = (Car)Factory.get("寶馬");
car2.create();
}
}
//生產(chǎn)車的工廠
class Factory {
public static Object get(String carType) {
Car car =null;
if (carType.equals("奧迪")) {
car = new Aodi();
} else if (carType.equals("寶馬")) {
car = new Baoma();
}
return car;
}
}
//奧迪車的類
class Aodi implements Car{
@Override
public void create() {
System.out.println("生產(chǎn)奧迪");
}
}
//寶馬車的類
class Baoma implements Car{
@Override
public void create() {
System.out.println("生產(chǎn)寶馬");
}
}
//汽車的接口
interface Car {
void create();
}
2.工廠模式
工廠模式也就是鼠標工廠是個父類,有生產(chǎn)鼠標這個接口主慰。
戴爾鼠標工廠嚣州,惠普鼠標工廠繼承它,可以分別生產(chǎn)戴爾鼠標共螺,惠普鼠標。
生產(chǎn)哪種鼠標不再由參數(shù)決定情竹,而是創(chuàng)建鼠標工廠時藐不,由戴爾鼠標工廠創(chuàng)建。
后續(xù)直接調用鼠標工廠.生產(chǎn)鼠標()即可
/**工廠方法模式
**/
public class MethodFactoryTest {
public static void main(String[] args) {
//需要生產(chǎn)奔馳就調用奔馳車的工廠
Aotuo aotuo = AotuoFactory.Create();
aotuo.Run();
//需要生產(chǎn)奧拓就調用生產(chǎn)凹凸車的工廠
Benchi benchi = BenchiFactory.Create();
benchi.Run();
}
}
//創(chuàng)建一個接口
interface Cars{
void Run();
}
//生產(chǎn)奧拓車的工廠
class AotuoFactory {
public static Aotuo Create() {
return new Aotuo();
}
}
//生產(chǎn)奔馳車的工廠
class BenchiFactory {
public static Benchi Create() {
return new Benchi() ;
}
}
class Aotuo implements Cars{
@Override
public void Run() {
System.out.println("生產(chǎn)奧拓");
}
}
class Benchi implements Cars{
@Override
public void Run() {
System.out.println("生產(chǎn)奔馳");
}
}
3.抽象工廠模式
抽象工廠模式也就是不僅生產(chǎn)鼠標,同時生產(chǎn)鍵盤雏蛮。
也就是 PC 廠商是個父類涎嚼,有生產(chǎn)鼠標,生產(chǎn)鍵盤兩個接口挑秉。
戴爾工廠法梯,惠普工廠繼承它,可以分別生產(chǎn)戴爾鼠標+戴爾鍵盤犀概,和惠普鼠標+惠普鍵盤立哑。
創(chuàng)建工廠時,由戴爾工廠創(chuàng)建姻灶。
后續(xù)工廠.生產(chǎn)鼠標()則生產(chǎn)戴爾鼠標铛绰,工廠.生產(chǎn)鍵盤()則生產(chǎn)戴爾鍵盤。
3-1 .在抽象工廠模式中产喉,假設我們需要增加一個工廠
假設我們增加華碩工廠捂掰,則我們需要增加華碩工廠,和戴爾工廠一樣曾沈,繼承 PC 廠商这嚣。
之后創(chuàng)建華碩鼠標,繼承鼠標類塞俱。創(chuàng)建華碩鍵盤姐帚,繼承鍵盤類即可。
3-2 .在抽象工廠模式中敛腌,假設我們需要增加一個產(chǎn)品
假設我們增加耳麥這個產(chǎn)品卧土,則首先我們需要增加耳麥這個父類,再加上戴爾耳麥像樊,惠普耳麥這兩個子類尤莺。
之后在PC廠商這個父類中,增加生產(chǎn)耳麥的接口生棍。最后在戴爾工廠颤霎,惠普工廠這兩個類中,分別實現(xiàn)生產(chǎn)戴爾耳麥涂滴,惠普耳麥的功能友酱。 以上。
/**
* 抽象工廠模式
**/
public class AbstractFactory {
public static void main(String[] args) {
DaierKebo daierKebo = DaierFactory.CreateKebo();
daierKebo.click();
DaierMouse daierMouse = DaierFactory.CreateMouse();
daierMouse.Run();
HuibuKebo huibuKebo = HuibuFactory.CreateKebo();
huibuKebo.click();
HuipuMouse huipuMouse = HuibuFactory.CreateMouse();
huipuMouse.Run();
LianxiangKebo lianxiangKebo = LianxiangFactory.CreateKebo();
lianxiangKebo.click();
LianxiangMouse lianxiangMouse = LianxiangFactory.CreateMouse();
lianxiangMouse.Run();
}
}
//生產(chǎn)鼠標和接口 和生產(chǎn)鍵盤的接口
interface Mouse{
void Run();
}
interface Kebo{
void click();
}
//接口的實現(xiàn)類惠普 和戴爾
class DaierMouse implements Mouse{
@Override
public void Run() {
System.out.println("生產(chǎn)戴爾的鼠標");
}
}
class HuipuMouse implements Mouse{
@Override
public void Run() {
System.out.println("生產(chǎn)惠普的鼠標");
}
}
class DaierKebo implements Kebo{
@Override
public void click() {
System.out.println("生產(chǎn)戴爾的鍵盤");
}
}
class HuibuKebo implements Kebo{
@Override
public void click() {
System.out.println("生產(chǎn)惠普的鍵盤");
}
}
//戴爾 和惠普的工廠
class DaierFactory{
public static DaierMouse CreateMouse(){
return new DaierMouse();
}
public static DaierKebo CreateKebo(){
return new DaierKebo();
}
}
class HuibuFactory{
public static HuipuMouse CreateMouse(){
return new HuipuMouse();
}
public static HuibuKebo CreateKebo(){
return new HuibuKebo();
}
}
//增加一個聯(lián)想公司
class LianxiangMouse implements Mouse{
@Override
public void Run() {
System.out.println("生產(chǎn)聯(lián)想鼠標");
}
}
class LianxiangKebo implements Kebo{
@Override
public void click() {
System.out.println("生產(chǎn)聯(lián)想鍵盤");
}
}
class LianxiangFactory {
public static LianxiangMouse CreateMouse(){
return new LianxiangMouse();
}
public static LianxiangKebo CreateKebo(){
return new LianxiangKebo();
}
}
由此可見柔纵,工廠方法確實為系統(tǒng)結構提供了非常靈活強大的動態(tài)擴展機制缔杉,只要我們更換一下具體的工廠方法,系統(tǒng)其他地方無需一點變換搁料,就有可能將系統(tǒng)功能進行改頭換面的變化或详。
————————————————
版權聲明:本文為CSDN博主「openstack_developer」的原創(chuàng)文章系羞,遵循 CC 4.0 BY-SA 版權協(xié)議,轉載請附上原文出處鏈接及本聲明霸琴。
原文鏈接:https://blog.csdn.net/wqwqwqwq403/article/details/89043234