码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(7)-----工厂设计模式(简单工厂设计模式)

时间:2018-10-04 11:32:01      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:family   一个   font   int   决定   微软   border   void   design   

简单工厂其实不是一个设计模式,反而像是一种编程习惯,我们来通过它引出工厂设计模式。

先来看一张类图

技术分享图片

pizza类

package com.DesignPatterns.ad.factory1; import java.util.ArrayList;

abstract public class Pizza {

    String name;

    String dough;

    String sauce;

    ArrayList<String> toppings = new ArrayList<String>();

    public String getName() {

         return name;     }

    public void prepare() {

         System.out.println("Preparing " + name);

    }

    public void bake() {

         System.out.println("Baking " + name);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

}

public void cut() {

    System.out.println("Cutting " + name);

}

public void box() {

    System.out.println("Boxing " + name);

}

public String toString() {

    StringBuffer display = new StringBuffer();

    display.append("---- " + name + " ----\n");

    display.append(dough + "\n");

    display.append(sauce + "\n");

    for (String topping : toppings) {

         display.append(topping + "\n");

    }

    return display.toString();

}

PizzaStore类

package com.DesignPatterns.ad.factory1;

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;

    }

}

SimplePizzaFactory工厂类

package com.DesignPatterns.ad.factory1; 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("veggie")) {

              pizza = new VeggiePizza();

         }

         return pizza;

    }

}

实现类一:CheesePizza

package com.DesignPatterns.ad.factory1;

public class CheesePizza extends Pizza {     public CheesePizza() {

         name = "Cheese Pizza";

         dough = "Regular Crust";

         sauce = "Marinara Pizza Sauce";

         toppings.add("Fresh Mozzarella");

         toppings.add("Parmesan");

    }

}

实现类二:PepperoniPizza

package com.DesignPatterns.ad.factory1;

public class PepperoniPizza extends Pizza {     public PepperoniPizza() {

         name = "Pepperoni Pizza";

         dough = "Crust";

         sauce = "Marinara sauce";

         toppings.add("Sliced Pepperoni");

         toppings.add("Sliced Onion");

         toppings.add("Grated parmesan cheese");

}

}

测试类:test

package com.DesignPatterns.ad.factory1;

/**

*

  • @author qingruihappy
  • @data 2018年9月24日 下午4:42:54
  • @说明:其实这个最简单了。
  • 思路:
  • 1:我们定义一个工厂类,主要存储变化的东西,在这里也就是SimplePizzaFactory这个类了,这里面存储的是运行时才决定的东西.
  • 其实里面的,最开始的模式就是在PizzaStore里面放着的。只不过由于这部分内容都是变化的,所以单独把它抽出来放到了工厂里面去了。

*

  • 2:PizzaStore这里面主要都要SimplePizzaFactory的引用,根据传进来的参数来决定是调用那个 pizza的实例,
  • 并且还有pizza的一些方法(注意这个时候就已经确定了是那个pizza的实例了)。让后确定了的 pizza的实例在调用pizza相对应的方法。

*

  • 3,pizza类中主要就是pizza实例的一些方法。

*

  • 4,总结一句话总结上面的就是,当程序运行的时候会根据传入的PizzaStore会根据传入的参数去SimplePizzaFactory
  • (因为PizzaStore有SimplePizzaFactory的实例)里面确定Pizza究竟是谁的实例,让后返回,再在PizzaStore里面接着执行
  • 这个就是就会调用Pizza里面的方法,因为CheesePizza等子类都继承了Pizza,所以这个时候

CheesePizza没有的方法,都会去父类里面找的。

  • 只需要把参数的值告诉Pizza就行了。

*

  • 补充:其实就相当于抽出来放到了另一个类中的道理是一样的。

*

  • 5,那问题来了,假如现在是两个工厂怎么办呢。就是说SimplePizzaFactory有两个,每个输出都不一样的呀。

*

*/

public class Test {

    public static void main(String[] args) {

         SimplePizzaFactory factory = new SimplePizzaFactory();

         PizzaStore store = new PizzaStore(factory);

         Pizza pizza = store.orderPizza("cheese");

         System.out.println("We ordered a " + pizza.getName() + "\n");

         System.out.println(pizza);

         pizza = store.orderPizza("veggie");

技术分享图片

现在假如pizza店是两个点现在改怎么办呢?

设计模式(7)-----工厂设计模式(简单工厂设计模式)

标签:family   一个   font   int   决定   微软   border   void   design   

原文地址:https://www.cnblogs.com/qingruihappy/p/9739640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!