• 设计模式


    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/u012515223/article/details/27081511

    工厂模式(factory pattern) 详细解释


    本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511


    工厂方法模式: 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类.

    包括:

    创建者父类(creator), 包括创建对象的方法(取代new详细的对象, 通过參数创建不同的对象), 和一些主要的方法;

    详细创建者(concrete creator), 继承创建者父类, 实现创建对象的方法, 不同參数能够创建不同的对象;

    产品类父类(product), 包括产品的基本用法, 被创建者父类(creator)的基本方法使用;

    详细产品(concrete creator), 继承产品类父类, 对特定的产品进行定制, 供详细创建者(concrete creator)选择创建;


    详细方法:

    1. 产品类父类(product), 包括产品的一些基本方法.

    代码:

    /**
     * @time 2014年5月26日
     */
    package factory;
    
    import java.util.ArrayList;
    
    /**
     * @author C.L.Wang
     *
     */
    public abstract class Pizza {
    	String name;
    	String dough; //生面团
    	String sauce; //调味汁
    	
    	ArrayList<String> toppings = new ArrayList<String>(); //装饰
    	
    	void prepare() {
    		System.out.println("Preparing " + name);
    		System.out.println("Tossing dough..." + dough);
    		System.out.println("Adding sauce..." + sauce);
    		System.out.println("Adding toppings: ");
    		for (int i=0; i<toppings.size(); ++i) {
    			System.out.println(" " + toppings.get(i));
    		}
    	}
    	
    	void bake() {
    		System.out.println("Bake for 25 minutes at 350");
    	}
    	
    	void cut() {
    		System.out.println("Cutting the pizza into diagonal slices");
    	}
    	
    	void box() {
    		System.out.println("Place pizza in official PizzaStore box");
    	}
    	
    	public String getName() {
    		return name;
    	}
    }
    

    2. 详细产品类(concrete product), 详细产品的定制方法.

    代码:

    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public class NYStyleCheesePizza extends Pizza {
    	public NYStyleCheesePizza() {
    		name = "NY Style Sauce and Cheese Pizza";
    		dough = "Thin Crust Dough";
    		sauce = "Marinara Sauce";
    		
    		toppings.add("Grated Reggiano Cheese");
    	}
    }
    
    
    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public class ChicagoStyleCheesePizza extends Pizza {
    	public ChicagoStyleCheesePizza() {
    		name = "Chicago Style Deep Dish Cheese Pizza";
    		dough = "Extra Thick Crust Dough";
    		sauce = "Plum Tomato Sauce";
    		
    		toppings.add("Shredded Mozzarella Cheese");
    	}
    	
    	void cut() {
    		System.out.println("Cutting the pizza into square slices");
    	}
    }
    

    3. 创建者父类(creator), 详细的用法, 调用产品类父类(product)的方法, 提供依据參数创建不同详细产品类(concrete product).

    代码:

    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public abstract class PizzaStore {
    	public Pizza orderPizza(String item) {
    		Pizza pizza;
    		pizza = createPizza(item);
    		
    		pizza.prepare();
    		pizza.bake();
    		pizza.cut();
    		pizza.box();
    		
    		return pizza;
    	}
    	
    	abstract Pizza createPizza(String item);
    }
    

    4. 详细创建者(concrete creator), 通过參数创建不同的详细产品(concrete product).

    代码:

    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public class NYPizzaStore extends PizzaStore {
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaStore#createPizza(java.lang.String)
    	 */
    	@Override
    	Pizza createPizza(String item) {
    		// TODO Auto-generated method stub
    		
    		if (item.equals("cheese")) {
    			return new NYStyleCheesePizza();
    		} else return null;
    	}
    
    }
    
    
    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public class ChicagoPizzaStore extends PizzaStore {
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaStore#createPizza(java.lang.String)
    	 */
    	@Override
    	Pizza createPizza(String item) {
    		// TODO Auto-generated method stub
    		
    		if (item.equals("cheese")) {
    			return new ChicagoStyleCheesePizza();
    		} else return null;
    	}
    
    }
    

    5. 測试, 创建不同的详细创建者(concrete creator), 即工厂, 通过调用函数的參数, 选择不同的产品进行使用.

    代码:

    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public class PizzaTestDrive {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		PizzaStore nyStore = new NYPizzaStore();
    		PizzaStore chicagoStore = new ChicagoPizzaStore();
    		
    		Pizza pizza = nyStore.orderPizza("cheese");
    		System.out.println("Ethan ordered a " + pizza.getName() + "
    ");
    		
    		pizza = chicagoStore.orderPizza("cheese");
    		System.out.println("Joel ordered a " + pizza.getName() + "
    ");
    	}
    
    }
    

    6. 输出:

    Preparing NY Style Sauce and Cheese Pizza
    Tossing dough...Thin Crust Dough
    Adding sauce...Marinara Sauce
    Adding toppings: 
     Grated Reggiano Cheese
    Bake for 25 minutes at 350
    Cutting the pizza into diagonal slices
    Place pizza in official PizzaStore box
    Ethan ordered a NY Style Sauce and Cheese Pizza
    
    Preparing Chicago Style Deep Dish Cheese Pizza
    Tossing dough...Extra Thick Crust Dough
    Adding sauce...Plum Tomato Sauce
    Adding toppings: 
     Shredded Mozzarella Cheese
    Bake for 25 minutes at 350
    Cutting the pizza into square slices
    Place pizza in official PizzaStore box
    Joel ordered a Chicago Style Deep Dish Cheese Pizza
    

    面向对象的设计原则:

    依赖倒置原则: 要依赖抽象, 不要依赖详细类.


    指导方针:

    1. 变量不能够持有详细类的引用.

    2. 不要让类派生自详细类.

    3. 不要覆盖基类中已实现的方法.






  • 相关阅读:
    2020年秋第四五周-代码规范,结对要求
    2020年秋第四五周-四则运算试题生成
    同时装了WPS和Office新建的时候不知道是哪个文件
    开讲啦郑强演讲:你为什么读大学?
    PC版kindle无法连接网络
    前端编程良好习惯
    教你隐藏盘符,把你的小姐姐藏起来
    腾讯,比你想的更有趣
    U盘之父中国朗科的一生:我曾打败索尼,如今却只能靠收租为生
    动作之概述
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10545296.html
  • Copyright © 2020-2023  润新知