Java设计模式之 简单工厂模式和工厂方法实验报告书

145 阅读5分钟

目录
Java设计模式之 1
简单工厂模式和工厂方法实验报告书 1
实验四:简单工厂模式和工厂方法 2
一、实验目的 2
二、实验内容 2
三、实验步骤 2
3.1简单工厂模式:女娲 2
3.2简单工厂模式:实例 6
3.3简单工厂模式:pizza 9
3.4工厂方法:女娲实例 14
3.5工厂方法:pizza 19
四、实验结果分析 26

实验四:简单工厂模式和工厂方法
一、实验目的
熟练使用JAVA实现简单工厂模式和工厂方法,理解设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。

二、实验内容
简单工厂模式:女娲、书上实例、pizza
工厂方法:女娲、pizza

三、实验步骤
3.1简单工厂模式:女娲
makePerson
{abstract}

makeMan

makeRobot

makeWoman

Factory

factoryMethod(String arg):Product

具体代码如下:
1.Clinet.java

package a.简单工厂模式.女娲;

public class Clinet {
    public static void main(String[] args) {
        makePerson make1Person;
        make1Person = Factory.getFactory("M");  
        make1Person.eat();  
        make1Person.run();
        make1Person = Factory.getFactory("W"); 
        make1Person.eat();
        make1Person.run();
        make1Person = Factory.getFactory("R"); 
        make1Person.eat();  
        make1Person.run();
    }
}

  1. Factory.java
package a.简单工厂模式.女娲;


public class Factory {
    public static makePerson getFactory(String people){
        makePerson make1Person=null; 
        if(people.equalsIgnoreCase("M")){
            make1Person = new makeMan();
        }else if(people.equalsIgnoreCase("W")){
            make1Person = new makeWoman();
        }else if(people.equalsIgnoreCase("R")){
            make1Person = new makeRobot();
        }
        return make1Person;
    }
}

  1. makeMan.java
package a.简单工厂模式.女娲;


public class makeMan extends makePerson{

    @Override
    public void eat() {
        System.out.println("男人在吃东西");
        super.eat();
    }
    @Override
    public void run() {
        System.out.println("男人在跑步");
        super.run();
    }
}

  1. makePerson.java
package a.简单工厂模式.女娲;


public abstract class makePerson {
    public void run(){
    }
    public void eat(){}

}

  1. makeRobot.java
package a.简单工厂模式.女娲;

public class makeRobot extends makePerson{
    @Override
    public void eat() {
        System.out.println("机器人没有在吃东西");
        super.eat();
    }
    @Override
    public void run() {
        System.out.println("机器人在跑步");
        super.run();
    }
}

  1. makeWoman.java
package a.简单工厂模式.女娲;

public class makeWoman extends makePerson{
    @Override
    public void eat() {
        System.out.println("女人在吃东西");
        super.eat();
    }
    @Override
    public void run() {
        System.out.println("女 人在跑步");
        super.run();
    }
}

运行结果如下:抓图

3.2简单工厂模式:实例

具体代码如下:

  1. Chart.java
package a.简单工厂模式.实例;

public interface Chart{
public void display();
}

  1. ChartFactory.java
package a.简单工厂模式.实例;


public class ChartFactory {
public static Chart getChart(String type){
	Chart chart=null;
	if(type.equalsIgnoreCase("histogram")){
		chart=new HistogramChart();
			System.out.println("初始化设置柱状图!");
			
	}
	else if (type.equalsIgnoreCase("pie")){
		
		chart=new PieChart();
		System.out.println("初始化设置饼状图!");
		
	}
	else if (type.equalsIgnoreCase("line")){
		chart=new LineChart();
		System.out.println("初始化设置折线图!");
		
	}
	return chart;
}
}

  1. Client.java
package a.简单工厂模式.实例;


public class Client {
public static void main(String args[]){
	Chart chart;
	chart=ChartFactory.getChart("histogram");
	chart.display();
}
}

  1. HistogramChart.java
package a.简单工厂模式.实例;

public class HistogramChart implements Chart {
	public HistogramChart(){
		System.out.println("创建柱状图!");
		
	}
public void display(){
	System.out.println("显示柱状图!");
	
}
}

  1. LineChart.java
package a.简单工厂模式.实例;

public class LineChart implements Chart {
public LineChart(){
	System.out.println("创建折线图!");
}
public void display(){
	System.out.println("显示折线图!");
	
}
}

  1. PieChart.java
package a.简单工厂模式.实例;

public class PieChart implements Chart  {
public PieChart(){
	System.out.println("创建饼状图!");
}
public void display(){
	System.out.println("显示饼状图!");
	
}
}

运行结果如下:

3.3简单工厂模式:pizza

具体代码如下:
1.CheesePizza.java

package a.简单工厂模式.pizza;

public class CheesePizza extends Pizza {
	@SuppressWarnings("unchecked")
	public CheesePizza() {
		name = "Style Sauce and Cheese Pizza";
		dough = "Cheese Dough";
		sauce = "Cheese Sauce";
		
		toppings.add("Cheese Toppings");
	}
	
}

  1. ClamPizza.java
package a.简单工厂模式.pizza;

public class ClamPizza extends Pizza {
	@SuppressWarnings("unchecked")
	public ClamPizza() {
		name = "Style Sauce and Clam Pizza";
		dough = "Clam Dough";
		sauce = "Clam Sauce";
		
		toppings.add("Clam Toppings");
	}
}

  1. PepperoniPizza.java
package a.简单工厂模式.pizza;

public class PepperoniPizza extends Pizza {
	@SuppressWarnings("unchecked")
	public PepperoniPizza() {
		name = "Style Sauce and Pepperoni Pizza";
		dough = "Pepperoni Dough";
		sauce = "Pepperoni Sauce";
		
		toppings.add("Pepperoni Toppings");
	}
}

  1. Pizza.java
package a.简单工厂模式.pizza;

import java.util.ArrayList;

public abstract class Pizza {
	protected String name;
	protected String dough;
	protected String sauce;
	
	@SuppressWarnings("rawtypes")
	protected
	ArrayList toppings = new ArrayList();
	
	public void prepare() {
		System.out.println("Preparing " + name);
		System.out.println("Tossing dough...");
		System.out.println("Adding sauce...");
		System.out.println("Adding toppings: ");
		for(int i = 0; i<toppings.size(); i++) {
			System.out.println("  "+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;
	}
}

  1. PizzaStore.java
package a.简单工厂模式.pizza;
public class PizzaStore {
	SimplePizzaFactory factory;
	public PizzaStore(SimplePizzaFactory factory) {
		this.factory = factory;
	}
	
	public Pizza orderPizza(String type) {
		Pizza pizza;
		pizza = factory.createPizza(type);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
}

  1. SimpleFactoryTest.java
package a.简单工厂模式.pizza;

public class SimpleFactoryTest {

	public static void main(String[] args) {
		SimplePizzaFactory factory = new SimplePizzaFactory();
		
		PizzaStore store = new PizzaStore(factory);
		Pizza pizza = store.orderPizza("cheese");
		System.out.println("The Store Ordered a " + pizza.getName() + "\n");
	}

}

  1. SimplePizzaFactory.java
package a.简单工厂模式.pizza;
public class SimplePizzaFactory {
	public Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("cheese")) {
			pizza = new CheesePizza();
		}else if(type.equals("pepperoni")) {
			pizza = new PepperoniPizza();
		}else if(type.equals("clam")) {
			pizza = new ClamPizza();
		}else if(type.equals("veggie")) {
			pizza = new VeggiePizza();
		}
		return pizza;
	}
}

  1. VeggiePizza.java
package a.简单工厂模式.pizza;
public class VeggiePizza extends Pizza {
	@SuppressWarnings("unchecked")
	public VeggiePizza() {
		name = "Style Sauce and Veggie Pizza";
		dough = "Veggie Dough";
		sauce = "Veggie Sauce";
		
		toppings.add("Veggie Toppings");
	}
}

运行结果如下:抓图

3.4工厂方法:女娲实例
Human
{abstract}

AfricaHuman

AsiaHuman

EuropeHuman

HumanFactory

factoryMethod(String arg):Product

AbstractHumanFactory

factoryMethod(String arg):Product

具体代码如下:(手写)
1、AbstractHumanFactory.java

package a.工厂方法.女娲;

public abstract class AbstractHumanFactory {
	 
public abstract Human createHuman(Class<? extends Human> c);
 
}

2、AfricaHuman.java

package a.工厂方法.女娲;
public  class  AfricaHuman implements Human {
	 
public void getColor(){
 
System.out.println("非洲人皮肤是黑色的。");
 
}
 
public void talk() {
 
System.out.println("非洲人会说话,一般人听不懂。");
 
}

@Override
public void class1() {
	
	System.out.println("非洲人分为男人和女人。");
	
}
 
}

3、AsiaHuman.java

package a.工厂方法.女娲;

public  class AsiaHuman implements Human {
	 
public void getColor(){
 
System.out.println("亚洲人的皮肤颜色是黄色的!");
 
}
 
public void talk() {
 
System.out.println("亚洲人会说话,一般说的都是双字节。");
 
}

@Override
public void class1() {
	
	System.out.println("亚洲人分为男人和女人。");
}
 
}

4、EuropeHuman.java

package a.工厂方法.女娲;

public  class EuropeHuman implements Human {
	 
public void getColor(){
 
System.out.println("欧洲人的皮肤颜色是白色的!");
 
}
 
public void talk() {
 
System.out.println("欧洲人会说话,一般都是但是单字节。");
 
}

@Override
public void class1() {
	
	System.out.println("欧洲人分为男人和女人");
}
 
}

5、Human.java

package a.工厂方法.女娲;

public interface Human {
	 
	public void getColor();
	public void talk();
	public void class1();
	}

6、HumanFactory.java

package a.工厂方法.女娲;

public class HumanFactory extends AbstractHumanFactory {
	 
public Human createHuman(Class<? extends Human> c){
 

 
Human human=null;
 
try {
 

 
human = (Human)Class.forName(c.getName()).newInstance();
 
} catch (Exception e) {
 
System.out.println("人种生成错误!");
 
}
 
return human;
 
}
 
}

7、NvWa.java

package a.工厂方法.女娲;

public class NvWa {
	 
public static void main(String[] args) {
 

 
AbstractHumanFactory humanfactory = new HumanFactory();
 

 
System.out.println("--造出的第一批人是欧洲人--");
 
Human europeHuman = humanfactory.createHuman(EuropeHuman.class);
 
europeHuman.getColor();
 
europeHuman.talk();
 

 
System.out.println("\n--造出的第二批人是非洲人--");
 
Human africeHuman = humanfactory.createHuman(AfricaHuman.class);
 
africeHuman.getColor();
 
africeHuman.talk();

 

 
System.out.println("\n--造出的第三批人是亚洲人--");
 
Human asiaHuman = humanfactory.createHuman(AsiaHuman.class);
 
asiaHuman.getColor();
 
asiaHuman.talk();
 
}
 
}

运行结果如下:抓图

3.5工厂方法:pizza
创造者

产品类

具体代码如下:
1.ChicagoCheesePizza.java

package a.工厂方法.pizza;



public class ChicagoCheesePizza extends Pizza {
	@SuppressWarnings("unchecked")
	public ChicagoCheesePizza() {
		name = "Chicago Style Deep Dish Cheese Pizza";
		dough = "Extra Thick Crust Dough";
		sauce = "Plum Tomato Sauce";
		toppings.add("Shredded Mozzarella Cheese");
	}
	public void cut() {
		System.out.println("Cutting the pizza into square slices");
	}
}

  1. ChicagoClamPizza.java
package a.工厂方法.pizza;


public class ChicagoClamPizza extends Pizza {

}

  1. ChicagoPepperoniPizza.java
package a.工厂方法.pizza;
public class ChicagoPepperoniPizza extends Pizza {

}

  1. ChicagoPizzaStore.java
package a.工厂方法.pizza;


public class ChicagoPizzaStore extends PizzaStore{
	Pizza createPizza(String type) {
		if(type.equals("cheese")) {
			return new ChicagoCheesePizza();
		}else if(type.equals("pepperoni")) {
			return new ChicagoPepperoniPizza();
		}else if(type.equals("clam")) {
			return new ChicagoClamPizza();
		}else if(type.equals("veggie")) {
			return new ChicagoVeggiePizza();
		}else return null;
	}
}

  1. ChicagoVeggiePizza.java
package a.工厂方法.pizza;

public class ChicagoVeggiePizza extends Pizza {

}

  1. NYCheesePizza.java
package a.工厂方法.pizza;


public class NYCheesePizza extends Pizza {
	@SuppressWarnings("unchecked")
	public NYCheesePizza() {
		name = "NY Style Sauce and Cheese Pizza";
		dough = "Thin Crust Dough";
		sauce = "Marinara Sauce";
		toppings.add("Grated Reggiano Cheese");
	}
}

  1. NYClamPizza.java
package a.工厂方法.pizza;


public class NYClamPizza extends Pizza {

}

8.NYPepperoniPizza.java

package a.工厂方法.pizza;


public class NYPepperoniPizza extends Pizza {

}

  1. NYPizzaStore.java
package a.工厂方法.pizza;


public class NYPizzaStore extends PizzaStore{

	Pizza createPizza(String type) {
		if(type.equals("cheese")) {
			return new NYCheesePizza();
		}else if(type.equals("pepperoni")) {
			return new NYPepperoniPizza();
		}else if(type.equals("clam")) {
			return new NYClamPizza();
		}else if(type.equals("veggie")) {
			return new NYVeggiePizza();
		}else return null;
	}
}

  1. NYVeggiePizza.java
package a.工厂方法.pizza;


public class NYVeggiePizza extends Pizza {

}

  1. Pizza.java
package a.工厂方法.pizza;

import java.util.ArrayList;

public abstract class Pizza {
	protected String name;
	protected String dough;
	protected String sauce;
	
	@SuppressWarnings("rawtypes")
	protected
	ArrayList toppings = new ArrayList();
	
	public void prepare() {
		System.out.println("Preparing " + name);
		System.out.println("Tossing dough...");
		System.out.println("Adding sauce...");
		System.out.println("Adding toppings: ");
		for(int i = 0; i<toppings.size(); i++) {
			System.out.println("  "+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;
	}
}

  1. PizzaStore.java
package a.工厂方法.pizza;


public abstract class PizzaStore {
	
	public Pizza orderPizza(String type) {
		Pizza pizza;
		pizza = createPizza(type);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
	
	abstract Pizza createPizza(String type);
}

  1. PizzaTestDrive.java
package a.工厂方法.pizza;


public class PizzaTestDrive {
	public static void main(String[] args) {
		PizzaStore nyStore = new NYPizzaStore();
		PizzaStore chicagoStore = new ChicagoPizzaStore();
		
		Pizza pizza = nyStore.orderPizza("cheese");
		System.out.println("nyStore order a " + pizza.getName() + "\n");
		pizza = chicagoStore.orderPizza("cheese");
		System.out.println("chicagoStore order a " + pizza.getName() + "\n");
	}
}

运行结果如下:

四、实验结果分析
1 简单工厂模式和工厂方法的设计意图
简单工厂模式:简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化
但是由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违背了“开放封闭原则”。
另外,简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,因此,简单工厂模式无法形成基于基类的继承树结构。

2 简单工厂模式和工厂方法的结构

3 简单工厂模式和工厂方法的优点
简单工厂模式优点:工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
工厂方法优点:克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广。
4 简单工厂模式和工厂方法的缺点
简单工厂模式缺点:
1 由于工厂类集中了所有实例的创建逻辑,这就直接导致一旦这个工厂出了问题,所有的客户端都会受到牵连;
2 而且由于简单工厂模式的产品基于一个共同的抽象类或者接口,这样一来,但产品的种类增加的时候,即有不同的产品接口或者抽象类的时候,工厂类就需要判断何时创建何种种类的产品,这就和创建何种种类产品的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护性;
3 更重要的是,简单工厂模式违背了“开放封闭原则”,就是违背了“系统对扩展开放,对修改关闭”的原则,因为当我新增加一个产品的时候必须修改工厂类,相应的工厂类就需要重新编译一遍。
工厂方法缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。

欢迎您关注我的微信公众号:学习微站(studysth)在这里插入图片描述

本文使用 文章同步助手 同步