介紹
我認爲把知識給別人講會,講明白,自己才徹底明白。
努力把文章寫好,寫明白每一篇文章,分享給更多人。
一個贊、一個評論、一個關注,真的好開心,努力沒有白費,得到了這麼多人的認可。
文章目錄
一、簡單工廠模式
介紹:
- 1、簡單工廠模式是屬於創建型模式,是工廠模式的一種。
簡單工廠模式是由一個工廠對象決定創建出哪個一種實體類的實例
。簡單工廠模式是工廠模式家族中最簡單使用的模式。- 2、簡單工廠模式:定義了一個創建對象的類,由這個類來
封裝實例化對象的行爲
;- 3、在軟件開發中,當我們會使用到大量的創建某種、某類或者某批對象時,就會使用到工廠模式。
大白話說:
你想要什麼,告訴我,我給你就是了。
用出行的方式來舉例子說明簡單工廠模式。
假設人們需要出行時可以騎自行車,可以走路,可以坐公交,可以開私家車,還可以火車和飛機,當然了未來說不定還有飛船之類的。那麼我們急用簡單工廠模式來實現這個出行的功能:
(一)創建抽象出行類
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:49
* @Description:
*/
public abstract class GoOut {
//只是一個抽象的方法,具體的功能實現讓交通工具去實現
public abstract void run();
}
(二)創建出行方式具體實現類
(1)步行
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:51
* @Description: 步行
*/
public class Walk extends GoOut{
@Override
public void run() {
System.out.println("步行");
}
}
(2)騎自行車
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:53
* @Description: 騎自行車
*/
public class Bike extends GoOut{
@Override
public void run() {
System.out.println("騎自行車");
}
}
(3)開汽車
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:53
* @Description:開汽車
*/
public class Car extends GoOut {
@Override
public void run() {
System.out.println("開汽車");
}
}
(三)創建工廠類
接下來創建一個工廠類,功能是提供給用戶的出行的方式,用戶只需要告訴工廠類他需要什麼方式就好了。
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:58
* @Description:爲用戶提供選擇出行的方式。
*/
public class GoOutFactory {
public static GoOut createGoOut(String goOutType){
GoOut goOut = null;
switch (goOutType){
case "walk":
goOut = new Walk();
break;
case "bike":
goOut = new Bike();
break;
case "car":
goOut = new Car();
break;
}
return goOut;
}
}
(四)創建客戶端測試
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 23:03
* @Description:測試類
*/
public class TestGoOut {
public static void main(String[] args) {
GoOutFactory.createGoOut("car").run();
GoOutFactory.createGoOut("walk").run();
GoOutFactory.createGoOut("bike").run();
}
}
測試結果:
開汽車
步行
騎自行車
Process finished with exit code 0
防爬蟲,看到請忽略
文章作者:TrueDei
作者博客首頁:http://truedei.blog.csdn.net
文章原文地址:https://truedei.blog.csdn.net/article/details/105822946
二、工廠方法模式
(一)介紹
工廠方法模式:定義了一個用於創建對象的接口,讓子類決定要實例化的類。工廠方法模式將一個類的實例化延遲倒子類。
(二)看一下需求,需求如下
有一個看書的程序,最初只有Python書。但是呢隨着發展,也會有越來越多的書。
(三)沒有使用工廠方法的代碼
package factory.Product;
/**
* @Auther: truedei
* @Date: 2020 /20-4-28 09:02
* @Description:
*/
public class FactoryMethod {
public static void main(String[] args) {
Application application = new Application();
ProductPython ogject = application.getOgject();
ogject.method();
}
}
class ProductPython{
public void method(){
System.out.println("這是Python的產品類的方法");
}
}
class Application{
private ProductPython createProduct(){
return new ProductPython();
}
ProductPython getOgject(){
ProductPython product = createProduct();
return product;
}
}
(四)使用工廠方法模式進行重構
爲了公司業務的發展需求,可以使用工廠方法模式進行代碼的重構。
/**
* @Auther: truedei
* @Date: 2020 /20-4-28 09:02
* @Description:
*/
public class FactoryMethod {
public static void main(String[] args) {
Application application = new CreateProductPython();
Product python = application.getObject();
python.method();
Application application1 = new CreateProductJava();
Product java = application1.getObject();
java.method();
}
}
//1、把公共的、穩定的方法給抽象出來
interface Product{
public void method();
}
class ProductPython implements Product{
public void method(){
System.out.println("這是Python的產品類的方法");
}
}
class ProductJava implements Product{
public void method(){
System.out.println("這是Java的產品類的方法");
}
}
class SimpleFactory{
public static Product createProduct(String bookType){
if(bookType.equals("python")){
return new ProductPython();
}else if(bookType.equals("Java")){
return new ProductJava();
}else {
return null;
}
}
}
abstract class Application{
abstract Product createProduct();
Product getObject(){
Product product = createProduct();
return product;
}
}
class CreateProductPython extends Application{
@Override
Product createProduct() {
return new ProductPython();
}
}
class CreateProductJava extends Application{
@Override
Product createProduct() {
return new ProductJava();
}
}
(五)使用場景
- 1、在不知道該使用對象的準確類型的時候
- 2、爲方便擴展組件的時候
(六)主要優點
- 1、將具體產品和創造者解耦
- 2、符合單一職責原則
- 3、符合開閉原則
防爬蟲,看到請忽略
文章作者:TrueDei
作者博客首頁:http://truedei.blog.csdn.net
文章原文地址:https://truedei.blog.csdn.net/article/details/105822946
三、抽象工廠模式
(一)介紹
提供一個創建一系列相關或互相依賴對象的接口,而無需指定它們具體的類。
(二)實例需求說明
開發一個數據庫的組件。
可以看到針對的是數據庫,那麼數據庫又有很多種類的數據庫,例如:Mysql,Oracle等。
共性:
1、連接數據
2、執行數據庫命令
3、等等…
(三)實現代碼
package factory.abstractFactory;
/**
* @Auther: truedei
* @Date: 2020 /20-4-28 18:00
* @Description:抽象工廠模式
*/
public class AbstractFactoryTest {
public static void main(String[] args) {
TrueDeiDatabaseUtils tdbu = new MysqlDataBaseUtils();
TrueDeiConnection connection = tdbu.getConnection();
connection.connect();//連接數據庫
TrueDeiCommand command = tdbu.getCommand();
command.command();//發送命令
TrueDeiDatabaseUtils Otdbu = new MysqlDataBaseUtils();
TrueDeiConnection Oconnection = Otdbu.getConnection();
Oconnection.connect();//連接數據庫
TrueDeiCommand Ocommand = tdbu.getCommand();
Ocommand.command();//發送命令
}
}
//抽象連接數據庫的類
interface TrueDeiConnection{
public void connect();
}
//抽象關閉數據庫連接的類
interface TrueDeiCommand{
public void command();
}
//工具類
interface TrueDeiDatabaseUtils{
//連接數據庫
TrueDeiConnection getConnection();
//發送命令
TrueDeiCommand getCommand();
}
//實現Mysql的連接實例
class MysqlConnection implements TrueDeiConnection{
@Override
public void connect() {
System.out.println("連接mysql數據庫");
}
}
//實現Mysql的發送命令的實例
class MysqlCommand implements TrueDeiCommand{
@Override
public void command() {
System.out.println("向mysql數據庫發送命令");
}
}
//實現Mysql的工具類 有一組接口的是工廠模式,一個接口的是工廠方法模式
class MysqlDataBaseUtils implements TrueDeiDatabaseUtils{
@Override
public TrueDeiConnection getConnection() {
return new MysqlConnection();
}
@Override
public TrueDeiCommand getCommand() {
return new MysqlCommand();
}
}
//實現Mysql的連接實例
class OracleConnection implements TrueDeiConnection{
@Override
public void connect() {
System.out.println("連接Oracle數據庫");
}
}
//實現Oracle的發送命令的實例
class OracleCommand implements TrueDeiCommand{
@Override
public void command() {
System.out.println("向Oracle數據庫發送命令");
}
}
//實現Oracle的工具類
class OracleDataBaseUtils implements TrueDeiDatabaseUtils{
@Override
public TrueDeiConnection getConnection() {
return new OracleConnection();
}
@Override
public TrueDeiCommand getCommand() {
return new OracleCommand();
}
}
測試結果:
連接mysql數據庫
向mysql數據庫發送命令
連接mysql數據庫
向mysql數據庫發送命令
(四)應用場景
程序需要處理不同系列的相關產品,但是您不希望它依賴於這些產品的具體類時,可以使用抽象工廠。
(五)優點
- 1、可以確信從工廠得到的產品彼此是兼容的;
- 2、可以避免具體產品和客戶端代碼之間的緊密耦合;
- 3、符合單一職責原則;
- 4、符合開閉原則(當新增一個功能時,不需要去修改之前的)。
(六)在源碼中的應用
像連接數據庫的jdbc的接口(Connection)等。