• 设计模式


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


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


    參考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511


    抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不须要明白指定详细类.

    所有代码: http://download.csdn.net/detail/u012515223/7403553


    详细方法:

    1. 提供一个抽象工厂(abstract factory)接口(interface)类, 不同的详细工厂(concrete factory)继承此类.

    代码:

    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public interface PizzaIngredientFactory {
    	public Dough createDough();
    	public Sauce createSauce();
    	public Cheese createCheese();
    	public Veggies[] createVeggies();
    	public Pepperoni createPepperoni();
    	public Clams createClam();
    }
    

    2. 详细工厂(concrete factory), 实现抽象工厂(abstract factory)接口(interface).

    代码:

    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createDough()
    	 */
    	@Override
    	public Dough createDough() {
    		// TODO Auto-generated method stub
    		return new ThinCrustDough();
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createSauce()
    	 */
    	@Override
    	public Sauce createSauce() {
    		// TODO Auto-generated method stub
    		return new MarinaraSauce();
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createCheese()
    	 */
    	@Override
    	public Cheese createCheese() {
    		// TODO Auto-generated method stub
    		return new ReggianoCheese();
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createVeggies()
    	 */
    	@Override
    	public Veggies[] createVeggies() {
    		// TODO Auto-generated method stub
    		Veggies veggies[] = {new Garlic(), new Onion(), new Mushroom(), new RedPepper()};
    		return veggies;
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createPepperoni()
    	 */
    	@Override
    	public Pepperoni createPepperoni() {
    		// TODO Auto-generated method stub
    		return new SlicedPepperoni();
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createClam()
    	 */
    	@Override
    	public Clams createClam() {
    		// TODO Auto-generated method stub
    		return new FreshClams();
    	}
    
    }
    
    
    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createDough()
    	 */
    	@Override
    	public Dough createDough() {
    		// TODO Auto-generated method stub
    		return new ThickCrustDough();
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createSauce()
    	 */
    	@Override
    	public Sauce createSauce() {
    		// TODO Auto-generated method stub
    		return new PlumTomatoSauce();
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createCheese()
    	 */
    	@Override
    	public Cheese createCheese() {
    		// TODO Auto-generated method stub
    		return new MozzarellaCheese();
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createVeggies()
    	 */
    	@Override
    	public Veggies[] createVeggies() {
    		// TODO Auto-generated method stub
    		Veggies veggies[] = {new BlackOlives(), new Spinach(), new Eggplant()};
    		return veggies;
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createPepperoni()
    	 */
    	@Override
    	public Pepperoni createPepperoni() {
    		// TODO Auto-generated method stub
    		return new SlicedPepperoni();
    	}
    
    	/* (non-Javadoc)
    	 * @see factory.PizzaIngredientFactory#createClam()
    	 */
    	@Override
    	public Clams createClam() {
    		// TODO Auto-generated method stub
    		return new FrozenClams();
    	}
    
    }
    

    3. 产品抽象(abstract)父类, 提供接口, 供详细产品(concrete product)调用.

    代码:

    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public abstract class Pizza {
    	String name;
    	Dough dough; //生面团
    	Sauce sauce; //调味汁
    	Veggies veggies[];
    	Cheese cheese;
    	Pepperoni pepperoni;
    	Clams clam;
    	
    	abstract void prepare();
    	
    	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");
    	}
    	
    	void setName(String name) {
    		this.name = name;
    	}
    	
    	public String getName() {
    		return name;
    	}
    }
    

    4. 详细产品(concrete product)继承产品抽象(abstract)父类, 使用工厂类实现继承接口通过不同的工厂生产不同的产品;

    代码:

    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public class CheesePizza extends Pizza {
    
    	PizzaIngredientFactory pizzaIngredientFactory;
    	
    	public CheesePizza(PizzaIngredientFactory pizzaIngredientFactory) {
    		this.pizzaIngredientFactory = pizzaIngredientFactory;
    	}
    	
    	/* (non-Javadoc)
    	 * @see factory.Pizza#prepare()
    	 */
    	@Override
    	void prepare() {
    		// TODO Auto-generated method stub
    		System.out.println("Preparing " + name);
    		dough = pizzaIngredientFactory.createDough();
    		sauce = pizzaIngredientFactory.createSauce();
    		cheese = pizzaIngredientFactory.createCheese();
    		System.out.println("Ingredient : " + dough + ", " + sauce + ", " + cheese);
    	}
    
    }
    
    
    /**
     * @time 2014年5月26日
     */
    package factory;
    
    /**
     * @author C.L.Wang
     *
     */
    public class ClamPizza extends Pizza {
    
    	PizzaIngredientFactory pizzaIngredientFactory;
    	
    	public ClamPizza(PizzaIngredientFactory pizzaIngredientFactory) {
    		this.pizzaIngredientFactory = pizzaIngredientFactory;
    	}
    	
    	/* (non-Javadoc)
    	 * @see factory.Pizza#prepare()
    	 */
    	@Override
    	void prepare() {
    		// TODO Auto-generated method stub
    		System.out.println("Preparing " + name);
    		dough = pizzaIngredientFactory.createDough();
    		sauce = pizzaIngredientFactory.createSauce();
    		cheese = pizzaIngredientFactory.createCheese();
    		clam = pizzaIngredientFactory.createClam();
    		System.out.println("Ingredient : " + dough + ", " 
    				+ sauce + ", " + cheese + ", " + clam);
    	}
    
    }
    

    5. 详细调用函数, 通过传递不同的參数, 调用不同的工厂, 生产出不同的产品.

    代码:

    /**
     * @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
    		Pizza pizza = null;
    		PizzaIngredientFactory pizzaIngredientFactory = new NYPizzaIngredientFactory();
    		if (item.equals("cheese")) {
    			pizza = new CheesePizza(pizzaIngredientFactory);
    			pizza.setName("New York Style Cheese Pizza");
    		} else if (item.equals("clam")) {
    			pizza = new ClamPizza(pizzaIngredientFactory);
    			pizza.setName("New York Style Clam Pizza");
    		}
    		
    		return pizza;
    	}
    
    }
    
    
    /**
     * @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
    		Pizza pizza = null;
    		PizzaIngredientFactory pizzaIngredientFactory = new ChicagoPizzaIngredientFactory();
    		if (item.equals("cheese")) {
    			pizza = new CheesePizza(pizzaIngredientFactory);
    			pizza.setName("Chicago Style Cheese Pizza");
    		} else if (item.equals("clam")) {
    			pizza = new ClamPizza(pizzaIngredientFactory);
    			pizza.setName("Chicago Style Clam Pizza");
    		}
    		
    		return pizza;
    	}
    
    }
    

    6. 測试函数

    代码:

    /**
     * @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() + "
    ");
    		
    		pizza = nyStore.orderPizza("clam");
    		System.out.println("Ethan ordered a " + pizza.getName() + "
    ");
    		
    		pizza = chicagoStore.orderPizza("clam");
    		System.out.println("Joel ordered a " + pizza.getName() + "
    ");
    	}
    
    }
    

    7. 输出:

    Preparing New York Style Cheese Pizza
    Ingredient : Thin Crust Dough, Marinara Sauce, Reggiano Cheese
    Bake for 25 minutes at 350
    Cutting the pizza into diagonal slices
    Place pizza in official PizzaStore box
    Ethan ordered a New York Style Cheese Pizza
    
    Preparing Chicago Style Cheese Pizza
    Ingredient : ThickCrust style extra thick crust dough, Tomato sauce with plum tomatoes, Shredded Mozzarella
    Bake for 25 minutes at 350
    Cutting the pizza into diagonal slices
    Place pizza in official PizzaStore box
    Joel ordered a Chicago Style Cheese Pizza
    
    Preparing New York Style Clam Pizza
    Ingredient : Thin Crust Dough, Marinara Sauce, Reggiano Cheese, Fresh Clams from Long Island Sound
    Bake for 25 minutes at 350
    Cutting the pizza into diagonal slices
    Place pizza in official PizzaStore box
    Ethan ordered a New York Style Clam Pizza
    
    Preparing Chicago Style Clam Pizza
    Ingredient : ThickCrust style extra thick crust dough, Tomato sauce with plum tomatoes,...
    Bake for 25 minutes at 350
    Cutting the pizza into diagonal slices
    Place pizza in official PizzaStore box
    Joel ordered a Chicago Style Clam Pizza
    








  • 相关阅读:
    uni.navigateTo 无法跳转到页面
    微信小程序 navigateTo 只能使用几次 无效后 怎么处理的?
    Vue中computed和watch的区别
    vue 动态添加样式的方式
    浏览器数据库IndexedDB介绍
    Gitlab CI/CD 之 Gitlab Runner Docker Executor 缓存问题
    Gitlab CI/CD 之 Gitlab-Runner
    .neter 的 java 学习之路
    Gitlab 迁移后 runner 访问报错的问题
    .neter 的 java 学习之路
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3760926.html
Copyright © 2020-2023  润新知