1.工廠方法(FactoryMethod)模式的定義
定義一個創(chuàng)建產品對象的工廠接口,將產品對象的實際創(chuàng)建工作推遲到具體子工廠類當中。這滿足創(chuàng)建型模式中所要求的“創(chuàng)建與使用相分離”的特點。
2.工廠方法模式的主要優(yōu)缺點
優(yōu)點:
- 用戶只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體創(chuàng)建過程;
- 在系統(tǒng)增加新的產品時只需要添加具體產品類和對應的具體工廠類,無須對原工廠進行任何修改,滿足開閉原則;
缺點:
- 每增加一個產品就要增加一個具體產品類和一個對應的具體工廠類,這增加了系統(tǒng)的復雜度。
3.工廠方法模式主要角色
- 抽象工廠(Abstract Factory):提供了創(chuàng)建產品的接口,調用者通過它訪問具體工廠的工廠方法 newProduct() 來創(chuàng)建產品。
- 具體工廠(ConcreteFactory):主要是實現(xiàn)抽象工廠中的抽象方法,完成具體產品的創(chuàng)建。
- 抽象產品(Product):定義了產品的規(guī)范,描述了產品的主要特性和功能。
- 具體產品(ConcreteProduct):實現(xiàn)了抽象產品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間一一對應。
4.工廠方法模式結構圖
5.工廠方法模式的實現(xiàn)
5.1 普通工廠模式,以消息發(fā)送為例
- 創(chuàng)建消息發(fā)送接口
package com.lw.designpattern.factorymethod.normal;
/**
* @Classname Sender
* @Description 消息發(fā)送接口
* @Author lw
* @Date 2019-12-21 15:24
*/
public interface Sender {
public void send();
}
- 創(chuàng)建郵件發(fā)送類,實現(xiàn)Sender接口
package com.lw.designpattern.factorymethod.normal;
/**
* @Classname MailSender
* @Description 郵件發(fā)送
* @Author lw
* @Date 2019-12-21 15:25
*/
public class MailSender implements Sender {
@Override
public void send() {
System.out.println("郵件發(fā)送。。。。。。");
}
}
- 創(chuàng)建短信發(fā)送類,實現(xiàn)Sender接口
package com.lw.designpattern.factorymethod.normal;
/**
* @Classname SmsSender
* @Description 短信發(fā)送
* @Author lw
* @Date 2019-12-21 15:26
*/
public class SmsSender implements Sender {
@Override
public void send() {
System.out.println("短信發(fā)送。。。。。。");
}
}
如果后續(xù)有其他方式消息發(fā)送,則只需要創(chuàng)建消息發(fā)送類,實現(xiàn)Sender接口即可。違背開閉原則
- 測試代碼
/**
* 工廠設計模式-普通工廠模式
*/
@Test
public void testNormalFactory(){
// 郵件發(fā)送
Sender sender = new MailSender();
sender.send();
// 短信發(fā)送
Sender sender1 = new SmsSender();
sender1.send();
}
- 打印結果
5.2 工廠方法模式,以飲料產品及生產為例
- 創(chuàng)建飲料產品接口
package com.lw.designpattern.factorymethod.multi;
/**
* @Classname DrinksProduct
* @Description 飲料產品接口
* @Author lw
* @Date 2019-12-21 14:22
*/
public interface DrinksProduct {
public void show();
}
- 創(chuàng)建可樂產品類,實現(xiàn)DrinksProduct接口
package com.lw.designpattern.factorymethod.multi;
/**
* @Classname ColaProduct
* @Description 可樂產品
* @Author lw
* @Date 2019-12-21 14:30
*/
public class ColaProduct implements DrinksProduct {
@Override
public void show() {
System.out.println("可樂產品顯示。。。。。。");
}
}
- 創(chuàng)建雪碧產品類,實現(xiàn)DrinksProduct接口
package com.lw.designpattern.factorymethod.multi;
/**
* @Classname SpriteProduct
* @Description 雪碧產品
* @Author lw
* @Date 2019-12-21 14:31
*/
public class SpriteProduct implements DrinksProduct {
@Override
public void show() {
System.out.println("雪碧產品顯示。。。。。。");
}
}
- 創(chuàng)建飲料工廠接口
package com.lw.designpattern.factorymethod.multi;
/**
* @Classname DrinksFactory
* @Description 飲料工廠接口
* @Author lw
* @Date 2019-12-21 15:04
*/
public interface DrinksFactory {
public DrinksProduct product();
}
- 創(chuàng)建可樂工廠類,實現(xiàn)DrinksFactory接口
package com.lw.designpattern.factorymethod.multi;
/**
* @Classname ColaFactory
* @Description 可樂工廠
* @Author lw
* @Date 2019-12-21 15:05
*/
public class ColaFactory implements DrinksFactory {
@Override
public DrinksProduct product() {
System.out.println("開始生產可樂。。。。。。");
return new ColaProduct();
}
}
- 創(chuàng)建雪碧工廠類,實現(xiàn)DrinksFactory接口
package com.lw.designpattern.factorymethod.multi;
/**
* @Classname SpriteFactory
* @Description 雪碧工廠
* @Author lw
* @Date 2019-12-21 15:05
*/
public class SpriteFactory implements DrinksFactory {
@Override
public DrinksProduct product() {
System.out.println("開始生產雪碧。。。。。。");
return new SpriteProduct();
}
}
后續(xù)增加其他產品,則需要增加一個具體產品類和一個對應的具體工廠類即可。滿足開閉原則。文章來源:http://www.zghlxwxcb.cn/news/detail-757414.html
- 測試代碼
/**
* 工廠設計模式-工廠方法模式
*/
@Test
public void testFactoryMethod(){
// 生產可樂
DrinksFactory drinksFactory = new ColaFactory();
DrinksProduct drinksProduct = drinksFactory.product();
drinksProduct.show();
// 生產雪碧
DrinksFactory drinksFactory1 = new SpriteFactory();
DrinksProduct drinksProduct1 = drinksFactory1.product();
drinksProduct1.show();
}
打印結果文章來源地址http://www.zghlxwxcb.cn/news/detail-757414.html
6.工廠方法模式的應用場景
- 客戶只知道創(chuàng)建產品的工廠名,而不知道具體的產品名。
- 創(chuàng)建對象的任務由多個具體子工廠中的某一個完成,而抽象工廠只提供創(chuàng)建產品的接口。
- 客戶不關心創(chuàng)建產品的細節(jié),只關心產品的品牌。
到了這里,關于java設計模式-工廠方法模式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!