zoukankan      html  css  js  c++  java
  • JAVA设计模式学习笔记-工厂模式

    案例1
    披萨

    不好的设计

    所有披萨的父类

    package com.java.test.pizzastore.pizza;
    
    public abstract class Pizza {
    	protected String name;
    	
    	public abstract void prepare();
    	public void bake()
    	{
    		System.out.println(name+" baking;");
    	}
    	public void cut()
    	{
    		System.out.println(name+" cutting;");
    	}
    	public void box()
    	{
    		System.out.println(name+" boxing;");
    	}
    	public void setname(String name)
    	{
    		this.name=name;
    	}
    }
    

    一种披萨

    package com.java.test.pizzastore.pizza;
    
    public class PepperPizza extends Pizza {
    
    	@Override
    	public void prepare() {
    		// TODO Auto-generated method stub
    		super.setname("PepperPizza");
    		
    		System.out.println(name+" preparing;");
    	}
    
    }
    

    另一种披萨

    package com.java.test.pizzastore.pizza;
    
    public class NYPepperPizza extends Pizza {
    
    	@Override
    	public void prepare() {
    		// TODO Auto-generated method stub
    		super.setname("NYPepperPizza");
    		
    		System.out.println(name+" preparing;");
    	}
    
    }
    

    OrderPizza
    这里不好的问题在于每加一种新的披萨,这个类里面也要相应的修改

    package com.java.test.pizzastore;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import com.java.test.pizzastore.pizza.CheesePizza;
    import com.java.test.pizzastore.pizza.ChinesePizza;
    import com.java.test.pizzastore.pizza.GreekPizza;
    import com.java.test.pizzastore.pizza.PepperPizza;
    import com.java.test.pizzastore.pizza.Pizza;
    
    public class OrderPizza {
    
    	public OrderPizza() {
    		Pizza pizza = null;
    		String ordertype;
    
    		do {
    			ordertype = gettype();
    
    			if (ordertype.equals("cheese")) {
    				pizza = new CheesePizza();
    			} else if (ordertype.equals("greek")) {
    				pizza = new GreekPizza();
    			} else if (ordertype.equals("pepper")) {
    				pizza = new PepperPizza();
    			} else if (ordertype.equals("chinese")) {
    				pizza = new ChinesePizza();
    			} else {
    				break;
    			}
    			pizza.prepare();
    			pizza.bake();
    			pizza.cut();
    			pizza.box();
    		} while (true);
    	}
    
    	private String gettype() {
    		try {
    			BufferedReader strin = new BufferedReader(new InputStreamReader(
    					System.in));
    			System.out.println("input pizza type:");
    			String str = strin.readLine();
    
    			return str;
    		} catch (IOException e) {
    			e.printStackTrace();
    			return "";
    		}
    	}
    
    }
    

    简单工厂模式方案

    工厂类

    package com.java.test.pizzastore.simplefactory;
    
    import com.java.test.pizzastore.pizza.CheesePizza;
    import com.java.test.pizzastore.pizza.GreekPizza;
    import com.java.test.pizzastore.pizza.PepperPizza;
    import com.java.test.pizzastore.pizza.Pizza;
    
    public class SimplePizzaFactory {
    
    	public Pizza CreatePizza(String ordertype) {
    		Pizza pizza = null;
    
    		if (ordertype.equals("cheese")) {
    			pizza = new CheesePizza();
    		} else if (ordertype.equals("greek")) {
    			pizza = new GreekPizza();
    		} else if (ordertype.equals("pepper")) {
    			pizza = new PepperPizza();
    		}
    		return pizza;
    
    	}
    
    }
    

    新的OrderPizza

    package com.java.test.pizzastore.simplefactory;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import com.java.test.pizzastore.pizza.CheesePizza;
    import com.java.test.pizzastore.pizza.GreekPizza;
    import com.java.test.pizzastore.pizza.PepperPizza;
    import com.java.test.pizzastore.pizza.Pizza;
    
    public class OrderPizza {
    	SimplePizzaFactory mSimplePizzaFactory;
    
    	public OrderPizza(SimplePizzaFactory mSimplePizzaFactory) {
    
    		setFactory(mSimplePizzaFactory);
    	}
    
    	public void setFactory(SimplePizzaFactory mSimplePizzaFactory) {
    		Pizza pizza = null;
    		String ordertype;
    
    		this.mSimplePizzaFactory = mSimplePizzaFactory;
    
    		do {
    			ordertype = gettype();
    			pizza = mSimplePizzaFactory.CreatePizza(ordertype);
    			if (pizza != null) {
    				pizza.prepare();
    				pizza.bake();
    				pizza.cut();
    				pizza.box();
    			}
    
    		} while (true);
    
    	}
    
    	private String gettype() {
    		try {
    			BufferedReader strin = new BufferedReader(new InputStreamReader(
    					System.in));
    			System.out.println("input pizza type:");
    			String str = strin.readLine();
    
    			return str;
    		} catch (IOException e) {
    			e.printStackTrace();
    			return "";
    		}
    	}
    
    }
    

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

    披萨加盟店需求
    工厂方法模式设计方案:将披萨项目里的披萨对象实例化功能抽象成抽象方法,在
    不同加盟店具体实现功能。

    新的OrderPizza

    package com.java.test.pizzastore.method;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import com.java.test.pizzastore.pizza.CheesePizza;
    import com.java.test.pizzastore.pizza.ChinesePizza;
    import com.java.test.pizzastore.pizza.GreekPizza;
    import com.java.test.pizzastore.pizza.PepperPizza;
    import com.java.test.pizzastore.pizza.Pizza;
    /*变成了抽象类*/
    public abstract class OrderPizza {
    
    	public OrderPizza() {
    		Pizza pizza = null;
    		String ordertype;
    
    		do {
    			ordertype = gettype();
    			pizza = createPizza(ordertype);
    
    			pizza.prepare();
    			pizza.bake();
    			pizza.cut();
    			pizza.box();
    		} while (true);
    	}
    
    	abstract Pizza createPizza(String ordertype);
    
    	private String gettype() {
    		try {
    			BufferedReader strin = new BufferedReader(new InputStreamReader(
    					System.in));
    			System.out.println("input pizza type:");
    			String str = strin.readLine();
    
    			return str;
    		} catch (IOException e) {
    			e.printStackTrace();
    			return "";
    		}
    	}
    
    }
    

    一家披萨店
    LDOrderPizza

    package com.java.test.pizzastore.method;
    
    import com.java.test.pizzastore.pizza.CheesePizza;
    import com.java.test.pizzastore.pizza.GreekPizza;
    import com.java.test.pizzastore.pizza.LDCheesePizza;
    import com.java.test.pizzastore.pizza.LDPepperPizza;
    import com.java.test.pizzastore.pizza.PepperPizza;
    import com.java.test.pizzastore.pizza.Pizza;
    
    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;
    
    	}
    
    }
    

    另一家披萨店
    NYOrderPizza

    package com.java.test.pizzastore.method;
    
    import com.java.test.pizzastore.pizza.CheesePizza;
    import com.java.test.pizzastore.pizza.GreekPizza;
    import com.java.test.pizzastore.pizza.NYCheesePizza;
    import com.java.test.pizzastore.pizza.NYPepperPizza;
    import com.java.test.pizzastore.pizza.PepperPizza;
    import com.java.test.pizzastore.pizza.Pizza;
    
    public class NYOrderPizza extends OrderPizza {
    
    	@Override
    	Pizza createPizza(String ordertype) {
    		Pizza pizza = null;
    
    		if (ordertype.equals("cheese")) {
    			pizza = new NYCheesePizza();
    		} else if (ordertype.equals("pepper")) {
    			pizza = new NYPepperPizza();
    		}
    		return pizza;
    
    	}
    
    }
    

    抽象工厂模式

    抽象工厂模式:定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确
    指定具体类

    就是把工厂给抽象了一层
    AbsFactory

    package com.java.test.pizzastore.absfactory;
    
    import com.java.test.pizzastore.pizza.Pizza;
    
    public interface AbsFactory {
    	public Pizza CreatePizza(String ordertype) ;
    }
    

    一家工厂

    package com.java.test.pizzastore.absfactory;
    
    import com.java.test.pizzastore.pizza.LDCheesePizza;
    import com.java.test.pizzastore.pizza.LDPepperPizza;
    import com.java.test.pizzastore.pizza.Pizza;
    
    public class LDFactory implements AbsFactory {
    
    	@Override
    	public Pizza CreatePizza(String ordertype) {
    		Pizza pizza = null;
    
    		if (ordertype.equals("cheese")) {
    			pizza = new LDCheesePizza();
    		} else if (ordertype.equals("pepper")) {
    			pizza = new LDPepperPizza();
    		}
    		return pizza;
    
    	}
    
    }
    

    另一家工厂

    package com.java.test.pizzastore.absfactory;
    
    import com.java.test.pizzastore.pizza.NYCheesePizza;
    import com.java.test.pizzastore.pizza.NYPepperPizza;
    import com.java.test.pizzastore.pizza.Pizza;
    
    public class NYFactory implements AbsFactory {
    
    	
    	@Override
    	public Pizza CreatePizza(String ordertype) {
    		Pizza pizza = null;
    
    		if (ordertype.equals("cheese")) {
    			pizza = new NYCheesePizza();
    		} else if (ordertype.equals("pepper")) {
    			pizza = new NYPepperPizza();
    		}
    		return pizza;
    
    	}
    
    }
    

    依赖抽象原则
    变量不要持有具体类的引用
    不要让类继承自具体类,要继承自抽象类或接口
    不要覆盖基类中已实现的方法

  • 相关阅读:
    重新点亮linux 命令树————网络配置的查看[十一三]
    重新点亮linux 命令树————网络管理[十一二]
    重新点亮linux 命令树————文件特殊权限[十一]
    重新点亮linux 命令树————权限的修改[十]
    重新点亮linux 命令树————文件权限和目录权限[九]
    重新点亮linux 命令树————用户和用户组的配置文件[八]
    重新点亮linux 命令树————su和sudo[七]
    综述|线结构光中心提取算法研究发展
    华为云服务功能总览
    国民技术芯片相关产业研发
  • 原文地址:https://www.cnblogs.com/kristse/p/factory.html
Copyright © 2011-2022 走看看