Java工廠模式優(yōu)雅地創(chuàng)建對象以及提高代碼復(fù)用率和靈活性
介紹
Java工廠設(shè)計模式主要分為三種:
簡單工廠模式(Simple Factory Pattern):使用一個工廠類來封裝對象創(chuàng)建的過程,客戶端只需要通過傳遞不同的參數(shù)來獲取不同的產(chǎn)品對象,從而避免了客戶端直接創(chuàng)建產(chǎn)品對象的操作
工廠方法模式(Factory Method Pattern):將工廠類抽象出來,每個具體產(chǎn)品類對應(yīng)一個具體工廠類,工廠類通過多態(tài)性來創(chuàng)建對應(yīng)的產(chǎn)品對象,客戶端只需要知道工廠接口及其實現(xiàn)類即可,可以根據(jù)需求動態(tài)切換工廠實現(xiàn),擴展性更好.
抽象工廠模式(Abstract Factory Pattern):在工廠方法模式的基礎(chǔ)上,將工廠類再進行一次抽象,將多個工廠接口放到一個工廠接口中,每個具體產(chǎn)品對應(yīng)一個具體工廠類,通過多態(tài)性來創(chuàng)建對應(yīng)的產(chǎn)品對象,具有更好的擴展性和更高的抽象程度,但是也增加了系統(tǒng)復(fù)雜度
簡單工廠模式
首先先定義一個抽象產(chǎn)品類:
package com.fanqiechaodan.factory.simple.product;
/**
* @Classname Product
* @Description 抽象產(chǎn)品類
*/
public abstract class Product {
public abstract void use();
}然后定義具體產(chǎn)品類
public class ProductA extends Product{
@Override
public void use() {
System.out.println("使用具體產(chǎn)品類A...");
}
}
public class ProductB extends Product{
@Override
public void use() {
System.out.println("使用具體產(chǎn)品類B...");
}
}
public class ProductC extends Product{
@Override
public void use() {
System.out.println("使用具體產(chǎn)品類C...");
}
}接下來定義工廠類,用于創(chuàng)建不同的產(chǎn)品
package com.fanqiechaodan.factory.simple.factory;
import com.fanqiechaodan.factory.simple.product.Product;
import com.fanqiechaodan.factory.simple.product.ProductA;
import com.fanqiechaodan.factory.simple.product.ProductB;
import com.fanqiechaodan.factory.simple.product.ProductC;
/**
* @Classname SimpleFactory
* @Description 工廠類
*/
public class SimpleFactory {
public static Product createProduct(String type) {
switch (type) {
case "A":
return new ProductA();
case "B":
return new ProductB();
case "C":
return new ProductC();
default:
throw new RuntimeException("不支持的產(chǎn)品類型:" + type);
}
}
}測試:
package com.fanqiechaodan.factory.simple;
import com.fanqiechaodan.factory.simple.factory.SimpleFactory;
import com.fanqiechaodan.factory.simple.product.Product;
/**
* @Classname Demo
* @Description 簡單工廠模式
*/
public class Demo {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.use();
Product productB = SimpleFactory.createProduct("B");
productB.use();
Product productC = SimpleFactory.createProduct("C");
productC.use();
Product productD = SimpleFactory.createProduct("D");
productD.use();
}
}
工廠方法模式
首先定義一個接口表示產(chǎn)品
package com.fanqiechaodan.factory.method.product;
/**
* @Classname Product
* @Description 產(chǎn)品接口
*/
public interface Product {
void use();
}其次定義兩個具體的產(chǎn)品實現(xiàn)類
public class ProductA implements Product{
@Override
public void use() {
System.out.println("使用具體產(chǎn)品A...");
}
}
public class ProductB implements Product{
@Override
public void use() {
System.out.println("使用具體產(chǎn)品B...");
}
}然后定義一個工廠接口用于創(chuàng)建產(chǎn)品
package com.fanqiechaodan.factory.method.factory;
import com.fanqiechaodan.factory.method.product.Product;
/**
* @Classname Factory
* @Description 工廠接口
*/
public interface Factory {
Product createProduct();
}接下來,定義兩個具體的工廠實現(xiàn)類,分別用于創(chuàng)建不同的產(chǎn)品
public class FactoryA implements Factory{
@Override
public Product createProduct() {
return new ProductA();
}
}
public class FactoryB implements Factory{
@Override
public Product createProduct() {
return new ProductB();
}
}測試
package com.fanqiechaodan.factory.method.factory;
import com.fanqiechaodan.factory.method.product.Product;
import com.fanqiechaodan.factory.method.product.ProductB;
/**
* @Classname FactoryB
* @Description 工廠實現(xiàn)類B
*/
public class FactoryB implements Factory{
@Override
public Product createProduct() {
return new ProductB();
}
}
抽象工廠模式
首先定義抽象產(chǎn)品
public interface ProductA {
void doSomething();
}
public interface ProductB {
void doSomething();
}其次定義具體產(chǎn)品
public class ProductA1 implements ProductA{
@Override
public void doSomething() {
System.out.println("ProductA1 doSomething ...");
}
}
public class ProductA2 implements ProductA{
@Override
public void doSomething() {
System.out.println("ProductA2 doSomething ...");
}
}
public class ProductB1 implements ProductB{
@Override
public void doSomething() {
System.out.println("ProductB1 doSomething ...");
}
}
public class ProductB2 implements ProductB{
@Override
public void doSomething() {
System.out.println("ProductB2 doSomething ...");
}
}然后定義抽象工廠
package com.fanqiechaodan.factory.abstractfactory.factory;
import com.fanqiechaodan.factory.abstractfactory.product.ProductA;
import com.fanqiechaodan.factory.abstractfactory.product.ProductB;
/**
* @Classname AbstractFactory
* @Description 抽象工廠
*/
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}接下來定義具體工廠
public class Factory1 implements AbstractFactory{
@Override
public ProductA createProductA() {
return new ProductA1();
}
@Override
public ProductB createProductB() {
return new ProductB1();
}
}
public class Factory2 implements AbstractFactory{
@Override
public ProductA createProductA() {
return new ProductA2();
}
@Override
public ProductB createProductB() {
return new ProductB2();
}
}測試
package com.fanqiechaodan.factory.abstractfactory;
import com.fanqiechaodan.factory.abstractfactory.factory.AbstractFactory;
import com.fanqiechaodan.factory.abstractfactory.factory.Factory1;
import com.fanqiechaodan.factory.abstractfactory.factory.Factory2;
import com.fanqiechaodan.factory.abstractfactory.product.ProductA;
import com.fanqiechaodan.factory.abstractfactory.product.ProductB;
/**
* @Classname Demo
* @Description 抽象工廠模式
*/
public class Demo {
public static void main(String[] args) {
// 使用具體工廠1創(chuàng)建產(chǎn)品A和產(chǎn)品B
AbstractFactory factory1 = new Factory1();
ProductA productA1 = factory1.createProductA();
ProductB productB1 = factory1.createProductB();
productA1.doSomething();
productB1.doSomething();
// 使用具體工廠2創(chuàng)建產(chǎn)品A和產(chǎn)品B
AbstractFactory factory2 = new Factory2();
ProductA productA2 = factory2.createProductA();
ProductB productB2 = factory2.createProductB();
productA2.doSomething();
productB2.doSomething();
}
}
總結(jié)
簡單工廠模式
優(yōu)點:
- 簡單易用,客戶端只需要知道工廠類和產(chǎn)品類即可
- 工廠類負責創(chuàng)建對象,客戶端無需知道具體得實現(xiàn)細節(jié)
- 可以根據(jù)參數(shù)動態(tài)創(chuàng)建對象
缺點:
- 工廠類負責創(chuàng)建所有得產(chǎn)品對象,當產(chǎn)品類型過多時,工廠類會變得十分臃腫
- 添加新產(chǎn)品需要修改工廠類的代碼,違反了開閉原則
工廠方法模式
優(yōu)點:
- 將每個產(chǎn)品類型的創(chuàng)建部分分散到具體的工廠類中,避免了簡單工廠模式中工廠類臃腫的問題
- 添加新產(chǎn)品只需要添加具體工廠類即可,符合開閉原則
缺點:
- 客戶端需要知道所有具體工廠類,使用起來不夠靈活
- 每個產(chǎn)品類型都需要對應(yīng)一個具體的工廠類,增加了系統(tǒng)類的個數(shù),增加了系統(tǒng)的復(fù)雜度
抽象工廠模式
優(yōu)點:
- 可以創(chuàng)建一組相關(guān)的產(chǎn)品對象,確保這些對象之間的兼容性
- 隱藏了產(chǎn)品對象的具體實現(xiàn),客戶端只需要知道抽象工廠和抽象產(chǎn)品即可
- 可以通過替換具體工廠來實現(xiàn)不同的產(chǎn)品組合,提高了系統(tǒng)的靈活性
缺點;
- 增加了系統(tǒng)的抽象性和復(fù)雜度,需要定義多個抽象工廠接口和多個具體工廠類
- 不容易支持新種類的產(chǎn)品,需要添加新的產(chǎn)品工廠接口和具體工廠類
到此這篇關(guān)于Java工廠模式優(yōu)雅地創(chuàng)建對象以及提高代碼復(fù)用率和靈活性的文章就介紹到這了,更多相關(guān)Java工廠模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA匿名內(nèi)部類(Anonymous Classes)的具體使用
本文主要介紹了JAVA匿名內(nèi)部類,匿名內(nèi)部類在我們JAVA程序員的日常工作中經(jīng)常要用到,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)(詳細代碼)
這篇文章主要介紹了Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)并附詳細的代碼詳解,需要的小伙伴可以參考一下2022-01-01
SpringBoot解析JSON數(shù)據(jù)的三種方案
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時也易于機器解析和生成,本文給大家介紹了SpringBoot解析JSON數(shù)據(jù)的三種方案,需要的朋友可以參考下2024-03-03
Java實現(xiàn)監(jiān)控多個線程狀態(tài)的簡單實例
下面小編就為大家?guī)硪黄狫ava實現(xiàn)監(jiān)控多個線程狀態(tài)的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
Java設(shè)計模式之解釋器模式_動力節(jié)點Java學院整理
解釋器模式是一個比較少用的模式,本人之前也沒有用過這個模式。下面我們就來一起看一下解釋器模式2017-08-08

