软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 开发杂谈 -> 工厂方法 -> 正文阅读

[开发杂谈]工厂方法


设计原则:依赖倒置原则(要依赖抽象,不要依赖具体类)
该设计原则的最佳实践方式的几个指导方针:
1.变量不可以持有具体类的引用。(如果使用new,就会持有具体类的引用,可用工厂来避开这样的做法)
2.不要类派生自具体类。(如果派生自具体类,就会依赖具体类)
3.不要覆盖基类中已实现的方法。(如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被继承的抽象,基类中实现的方法应该由所有的子类共享)
我们在写代码的时候尽量去追寻这些方针,将这些方针内化成你的设计的一部分(不追求代码之美的自动忽略)。
 
下面回到工厂模式
先来看下工厂方法模式的定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

工厂方法的UML图:
[img]http://images.cnitblog.com/blog/425275/201305/07225750-dcd53aaf4bac42d0a88802fd314e81da.png
 
下面是Head First中关于工厂方法模式的PizzaDemo:
[img]http://common.cnblogs.com/images/copycode.gif
package com.zjut.json.factoryMethod;

import java.util.ArrayList;

/**
 * 披萨类
 * 
 * @author json
 *
 * @date 2013-5-7
 */
public abstract class Pizza {
    
    /**pizza的名字*/
    private String name;
    
    /**pizza的面团类型*/
    private String dough;
    
    /**pizza酱料类型*/
    private String sauce;
    
    /**pizza相关佐料*/
    @SuppressWarnings("rawtypes")
    ArrayList toppings = new ArrayList();
    
    public void prepare(){
        System.out.println("Preparing " + getName());
        System.out.println("Tossing dough...");
        System.out.println("Adding sauce...");
        System.out.println("Adding toppings: ");
        for(int i = 0; i < toppings.size(); i++){
            if(i == toppings.size()-1){
                System.out.print( toppings.get(i));
            }else{
                System.out.print(toppings.get(i) + ",");
            }
        }
    }
    
    public void bake(){
        System.out.println("Bake for 25 minutes at 350");
    }
    
    public void cut(){
        System.out.println("Cutting the pizza into diagonal slices");
    }
    
    public void box(){
        System.out.println("Place pizza in official PizzaStore box");
    }

    public String getName() {
        return name;
    }

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

    public String getDough() {
        return dough;
    }

    public void setDough(String dough) {
        this.dough = dough;
    }

    public String getSauce() {
        return sauce;
    }

    public void setSauce(String sauce) {
        this.sauce = sauce;
    }

    @SuppressWarnings("rawtypes")
    public ArrayList getToppings() {
        return toppings;
    }

    @SuppressWarnings("rawtypes")
    public void setToppings(ArrayList toppings) {
        this.toppings = toppings;
    }
    
}

[img]http://common.cnblogs.com/images/copycode.gif
[img]http://common.cnblogs.com/images/copycode.gif
package com.zjut.json.factoryMethod;

/**
 * 具体风味的披萨
 * 
 * @author json
 *
 * @date 2013-5-7
 */
public class NYStyleCheesePizza extends Pizza {
    @SuppressWarnings("unchecked")
    public NYStyleCheesePizza(){
        setName("NY Style Sauce and cheese Pizza");
        setDough("Thin Crust Dough");
        getToppings().add("Grated Reggiano Cheese");
    }
}

[img]http://common.cnblogs.com/images/copycode.gif
[img]http://common.cnblogs.com/images/copycode.gif
package com.zjut.json.factoryMethod;

/**
 * 具体风味的Pizza
 * 
 * @author json
 *
 * @date 2013-5-7
 */
public class ChicagoStyleCheesePizza extends Pizza {
    @SuppressWarnings("unchecked")
    public ChicagoStyleCheesePizza(){
        setName("Chicago Style Sauce and cheese Pizza");
        setDough("Extra Thick Crust Dough");
        setSauce("Plum Tomato Sauce");
        getToppings().add("Shredded Mozzarella Cheese");
    }
    
    public void cut(){
        System.out.println("Cutting the pizza into square slices");
    }
}

[img]http://common.cnblogs.com/images/copycode.gif
[img]http://common.cnblogs.com/images/copycode.gif
package com.zjut.json.factoryMethod;

/**
 * 披萨商店
 * 
 * @author json
 *
 * @date 2013-5-7
 */
public abstract class PizzaStore {
    
    public final  Pizza orderPizza(final String type){
        Pizza pizza;
        pizza = createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
    
    /**
     * 创建pizza的抽象方法
     * 
     * @param type pizza的类型那个
     * 
     * @return Pizza对象
     */
    protected abstract Pizza createPizza(final String type);
}

[img]http://common.cnblogs.com/images/copycode.gif
[img]http://common.cnblogs.com/images/copycode.gif
package com.zjut.json.factoryMethod;

/**
 * 具体披萨商店
 * 
 * @author json
 *
 * @date 2013-5-7
 */
public class NYPizzaStore extends PizzaStore {

    @Override
    protected Pizza createPizza(String type) {
        if("cheese".equals(type)){
            return new NYStyleCheesePizza();
        }
        return null;
    }

}

[img]http://common.cnblogs.com/images/copycode.gif
[img]http://common.cnblogs.com/images/copycode.gif
package com.zjut.json.factoryMethod;

/**
 * 具体披萨商店
 * 
 * @author json
 *
 * @date 2013-5-7
 */
public class ChicagoPizzaStore extends PizzaStore {

    @Override
    protected Pizza createPizza(String type) {
        if("cheese".equals(type)){
            return new ChicagoStyleCheesePizza();
        }
        return null;
    }

}

[img]http://common.cnblogs.com/images/copycode.gif
测试类:
[img]http://common.cnblogs.com/images/copycode.gif
package com.zjut.json.factoryMethod;

/**
 * @author json
 *
 * @date 2013-5-7
 */
public class PizzaStoreTest {

    public static void main(String[] args){
        PizzaStore nystore = new NYPizzaStore();
        PizzaStore chicagostore = new ChicagoPizzaStore();
        Pizza pizza = nystore.orderPizza("cheese");
        System.out.println("Json ordered a " + pizza.getName());
        pizza = chicagostore.orderPizza("cheese");
        System.out.println("Joe ordered a " + pizza.getName());
    }
}

[img]http://common.cnblogs.com/images/copycode.gif
测试结果:
[img]http://images.cnitblog.com/blog/425275/201305/07230419-e4d31bf768054590a0e4a641462b4195.png
收工!!!
人生最可贵的事情是sb似的坚持于追求……
......显示全文...
    点击查看全文


上一篇文章      下一篇文章      查看所有文章
2016-04-03 20:46:48  
开发杂谈 最新文章
BloomFilter
大学四年编程之历程
内核分析
造人论坛——意识的本质和一个人工脑模型
OFDM信号[matlab描述]
人类还会进化吗?
HDUACM1035RobotMotion简单模拟题
树、二叉树(二)
iisphpweb.config处理404,500等,跳转友好
DatabaseAsaFortress
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年1日历
2018-1-20 7:32:06
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --