目录
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();
}
}
- 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;
}
}
- 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();
}
}
- makePerson.java
package a.简单工厂模式.女娲;
public abstract class makePerson {
public void run(){
}
public void eat(){}
}
- 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();
}
}
- 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简单工厂模式:实例
具体代码如下:
- Chart.java
package a.简单工厂模式.实例;
public interface Chart{
public void display();
}
- 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;
}
}
- Client.java
package a.简单工厂模式.实例;
public class Client {
public static void main(String args[]){
Chart chart;
chart=ChartFactory.getChart("histogram");
chart.display();
}
}
- HistogramChart.java
package a.简单工厂模式.实例;
public class HistogramChart implements Chart {
public HistogramChart(){
System.out.println("创建柱状图!");
}
public void display(){
System.out.println("显示柱状图!");
}
}
- LineChart.java
package a.简单工厂模式.实例;
public class LineChart implements Chart {
public LineChart(){
System.out.println("创建折线图!");
}
public void display(){
System.out.println("显示折线图!");
}
}
- 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");
}
}
- 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");
}
}
- 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");
}
}
- 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;
}
}
- 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;
}
}
- 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");
}
}
- 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;
}
}
- 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");
}
}
- ChicagoClamPizza.java
package a.工厂方法.pizza;
public class ChicagoClamPizza extends Pizza {
}
- ChicagoPepperoniPizza.java
package a.工厂方法.pizza;
public class ChicagoPepperoniPizza extends Pizza {
}
- 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;
}
}
- ChicagoVeggiePizza.java
package a.工厂方法.pizza;
public class ChicagoVeggiePizza extends Pizza {
}
- 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");
}
}
- NYClamPizza.java
package a.工厂方法.pizza;
public class NYClamPizza extends Pizza {
}
8.NYPepperoniPizza.java
package a.工厂方法.pizza;
public class NYPepperoniPizza extends Pizza {
}
- 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;
}
}
- NYVeggiePizza.java
package a.工厂方法.pizza;
public class NYVeggiePizza extends Pizza {
}
- 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;
}
}
- 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);
}
- 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)
本文使用 文章同步助手 同步