學習筆記【23種設計模式-第三節:工廠模式--簡單工廠、工廠方法、抽象工廠】
阿新 • • 發佈:2020-12-16
工廠模式
簡單工廠模式
簡述:
- 簡單工廠模式屬於建立型模式,是工廠模式的一種,簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項。簡單工廠模式是工廠模式家族中最簡單實用的模式。
- 簡單工廠模式:定義一個建立物件的類,有這個類來封裝例項化物件的行為。
- 在軟體開發中,當我們會用到大量的建立某種、某類或者某物件時,就會使用到工廠模式。
Pizza類:
public abstract class PizzaTest {
protected String name;
public abstract void prepare() ;
public void bake(){
System.out.println(name+" breaking;");
}
public void cut(){
System.out.println(name+" cutting!");
}
public void box(){
System.out.println(name+" boxing!");
}
public void setName(String name) {
this .name = name;
}
}
CheesePizza類
public class CheesePizza extends PizzaTest {
@Override
public void prepare() {
System.out.println("給製作乳酪pizza準備材料!");
}
}
GreekPizza類
public class GreekPizza extends PizzaTest {
@Override
public void prepare() {
System. out.println("給製作希臘pizza準備材料!");
}
}
OrderPizza類:
public class OrderPizza {
public OrderPizza(SimpleFactory simpleFactory) {
setFactory(simpleFactory);
}
SimpleFactory simpleFactory;
PizzaTest pizzaTest;
public void setFactory(SimpleFactory simpleFactory){
this.simpleFactory=simpleFactory;
String orderType="";
do {
orderType=getType();
pizzaTest=this.simpleFactory.creatPizza(orderType);
if (pizzaTest!=null){
pizzaTest.prepare();
pizzaTest.bake();
pizzaTest.cut();
pizzaTest.box();
}else{
System.out.println("訂購失敗!");
break;
}
}while (true);
}
private String getType(){
Scanner s=new Scanner(System.in);
System.out.println("Please Input Pizza Type:");
String str=s.next();
return str;
}
}
SimpleFactory類:
public class SimpleFactory {
public PizzaTest creatPizza(String orderType){
PizzaTest pizza=null;
System.out.println("使用簡單工廠模式");
if (orderType.equals("greek")){
pizza=new GreekPizza();
pizza.setName("希臘披薩!");
}else if(orderType.equals("cheese")) {
pizza = new GreekPizza();
pizza.setName("乳酪披薩!");
}
return pizza;
}
}
主程式
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza(new SimpleFactory());
System.out.println("---退出程式---");
}
}
簡單工廠模式又叫靜態工廠模式
將簡單工廠的方法設為靜態的。
改進:
SimpleFactory類:
public class SimpleFactory {
public static PizzaTest creatPizza(String orderType){
PizzaTest pizza=null;
System.out.println("使用簡單工廠模式");
if (orderType.equals("greek")){
pizza=new GreekPizza();
pizza.setName("希臘披薩!");
}else if(orderType.equals("cheese")) {
pizza = new GreekPizza();
pizza.setName("乳酪披薩!");
}
return pizza;
}
}
OrderPizza類:
public class OrderPizza {
PizzaTest pizzaTest=null;
String orderType="";
public OrderPizza() {
do {
orderType=getType();
pizzaTest=SimpleFactory.creatPizza(orderType);
if (pizzaTest!=null){
pizzaTest.prepare();
pizzaTest.bake();
pizzaTest.cut();
pizzaTest.box();
}else{
System.out.println("訂購失敗!");
break;
}
}while (true);
}
private String getType(){
Scanner s=new Scanner(System.in);
System.out.println("Please Input Pizza Type:");
String str=s.next();
return str;
}
}
工廠方法模式
- 披薩專案有了新的需求,可以點不同地方口味的,比如北京的乳酪披薩,倫敦的乳酪披薩等。
- 使用簡單工廠模式,建立不同的簡單工廠類,比如北京的簡單工廠、倫敦的簡單工廠,但考慮到專案規模,軟體的可維護性個可擴充套件性不是特別好。
- 使用工廠方法模式。
簡述:
- 工廠方法模式設計方案: 將劈殺專案的例項化功能抽象成抽象方法,在不同地方的口味點餐子類種具體實現。
- 工廠方法模式: 定義了一個建立物件的抽象方法,由子類決定要例項化的類。工廠方法模式將物件的例項化推遲到了子類。
例子:有BJCheesePizza,BJPepperPizza,LDCheesePizza,LDPepperPizza四個類,繼承Pizza類,有一個OrderPizza抽象類,BJOrderPizza和LDOrderPizza類繼承OrderPizza。
OrderPizza抽象類:
public abstract class OrderPizza {
abstract Pizza createPizza(String orderType);
public OrderPizza(){
Pizza pizza=null;
String orderType;
do {
orderType=getType();
pizza=createPizza(orderType);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while (true);
}
private String getType(){
Scanner s=new Scanner(System.in);
System.out.println("Please Input Pizza Type:");
String str=s.next();
return str;
}
}
BJOrderPizza類:
public class BJOrderPizza extends OrderPizza{
@Override
Pizza createPizza(String orderType) {
Pizza pizza=null;
if (orderType.equals("cheese")) pizza=new BJCheesePizza();
else if (orderType.equals("pepper")) pizza=new BJPepperPizza();
return pizza;
}
}
LDOrderPizza類:
public class LDOrderPizza extends OrderPizza{
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) pizza = new LDCheesePizza();
else if (orderType.equals("pepper")) pizza = new LDPepperPizza();
return pizza;
}
}
抽象工廠模式
簡述:
- 抽象工廠模式:定義了一個interface用於建立相關或有依賴關係的物件簇,而無需指明具體的類。
- 抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整合。
- 從設計層面看,抽象工廠模式就是對簡單工廠模式的改進(或者稱為進一步抽象)。
- 將工廠抽象層兩層,AbsFactory(抽象工廠)和具體實現的工廠子類。程式設計師根據建立物件型別使用相應的工廠子類。這樣將單個的簡單工廠類變成了工廠簇,更利於程式碼的維護和擴充套件。
例子:Pizza和前面是一樣的,多定義了一個介面ABSFactory,裡面有一個createPizza()方法,BJFactory及LDFactory類實現了該介面,在裡面new物件,和前面的大同小異,OrderPizza類中傳入了ABSFactory介面(聚合,傳入構造器)。
OrderPizza類:
public class OrderPizza {
ABSFactory absFactory;
public OrderPizza(ABSFactory absFactory) {
setAbsFactory(absFactory);
}
private void setAbsFactory(ABSFactory absFactory) {
this.absFactory=absFactory;
Pizza pizza=null;
String orderType="";
do {
orderType=getType();
pizza= absFactory.creatPizza(orderType);
if (pizza!=null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else{
System.out.println("訂購失敗!");
break;
}
}while (true);
}
private String getType(){
Scanner s=new Scanner(System.in);
System.out.println("Please Input Pizza Type:");
String str=s.next();
return str;
}
}
小結:
① 工廠模式的意義:將例項化物件的程式碼提取出來,放到一個類中統一管理和維護,達到和主專案的依賴關係的解耦。從而提高專案的擴充套件和維護性。
② 三種工廠模式(簡單工廠模式、工廠方法模式、抽象工廠模式)
③ 設計模式的依賴抽象原則
- 建立物件例項時,不要直接new類,而是把這個new類的動作放在一個工廠的方法中,並返回,有的書上說,變數不要直接持有具體類的引用。
- 不要讓類繼承具體類,而是繼承抽象類或者是實現介面。
- 不要覆蓋基類中已經實現的方法。