VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Java教程 >
  • 设计模式(三)——Java工厂方法模式

工厂方法模式

1 看一个新的需求

披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza。

思路 1

使用简单工厂模式,创建不同的简单工厂类,比如 BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等.从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好

思路 2

使用工厂方法模式

4 工厂方法模式介绍

1) 工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。

2) 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

5 工厂方法模式应用案例

1) 披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza

2) 思路分析图解

Pizza类

复制代码
package com.lin.factorymethod;


abstract class Pizza{
    
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void prepare() {
        System.out.println(name + " are prepared!");
    }
    
    public void bake() {
        System.out.println(name + " are baked!");
    }
    
    public void cut() {
        System.out.println(name + " are cutted!");
    }
    
    public void box() {
        System.out.println(name + " are boxed!");
    }
    
}

// 北京chesspizza
class BJChessPizza extends Pizza{

}

// 北京greekpizza
class BJGreekPizza extends Pizza{
    
}

//伦敦chesspizza
class LNChessPizza extends Pizza{

}

//伦敦greekpizza
class LNGreekPizza extends Pizza{
    
}
复制代码

OrderPizza

复制代码
package com.lin.factorymethod;

import java.util.Scanner;

public abstract class OrderPizza {
    
    public OrderPizza(){
        Pizza pizza = null;
        String orderType;
        while(true) {
            orderType = getType();
            pizza = createPizza(orderType); 
            if( pizza != null) {
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println("没有这种类型!");
            }
            
        }
    }
    
    // 定义一个抽象方法,createPizza,让各个工厂子类去实现
    public abstract Pizza createPizza(String orderType);
        

    public String getType() {
        Scanner str = new Scanner(System.in);
        System.out.println("please input the type of ordered pizza:");
        String type = str.next();
        return type;
    }
}

class BJOrderPizza extends OrderPizza {

    @Override
    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")) {
            pizza = new BJChessPizza();
            pizza.setName("北京Cheese");
        } else if(orderType.equals("greek")) {
            pizza = new BJGreekPizza();
            pizza.setName("北京Greek");
        }
        return pizza;
    }
    
}

class LNOrderPizza extends OrderPizza {

    @Override
    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")) {
            pizza = new LNChessPizza();
            pizza.setName("伦敦Cheese");
        } else if(orderType.equals("greek")) {
            pizza = new LNGreekPizza();
            pizza.setName("伦敦Greek");
        }
        return pizza;
    }
    
}
复制代码

PizzaStore类

复制代码
package com.lin.factorymethod;

import java.util.Scanner;

public class PizzaStore {

    public static void main(String[] args) {
        System.out.println("请输入地名:");
        Scanner scanner = new Scanner(System.in);
        String place = "";

        place = scanner.next();
        if(place.equals("伦敦")) {
            new LNOrderPizza();
        } else if(place.equals("北京")) {
            new BJOrderPizza();
        } else {
            System.out.println("该地域暂时没有开通功能!");
        }
    }
    

}
复制代码

 

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

蓝天和白云是标配。
 
原文:https://www.cnblogs.com/linzm14/p/14365053.html

相关教程