`
jijun87120681
  • 浏览: 41307 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

设计模式----简单工厂模式

 
阅读更多

         今天讲一下,简单工厂模式。

         当我们看到“new”的时候,就会想到“具体”,一般我们的程序都要求面相接口编程:父类引用指向子类对象,而对象的创建这块一般就是会发生变化的部分,看看下面的例子:

以一个披萨店(PizzaStore)为例,需要制造出奶酪披萨(CheesePizza),香肠披萨(PepperoniPizza),披萨模板完成后,就是披萨筹备,烘焙,切,装盒,完工。

 

 

/**
 * 披萨
 */
abstract public class Pizza {
	/**
	 * 披萨名
	 */
	String name;
	
	/**
	 * 披萨面
	 */
	String dough;
	
	
	/**
	 * 调汁
	 */
	String sauce;
	
	/**
	 * 配料
	 */
	ArrayList toppings = new ArrayList();

	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() {
		// code to display pizza name and ingredients
		StringBuffer display = new StringBuffer();
		display.append("---- " + name + " ----\n");
		display.append(dough + "\n");
		display.append(sauce + "\n");
		for (int i = 0; i < toppings.size(); i++) {
			display.append((String )toppings.get(i) + "\n");
		}
		return display.toString();
	}
}

 

 

 

 

/**
 * 披萨店
 *
 */
public class PizzaStore {
 
	public Pizza orderPizza(String type) {
		Pizza pizza = null;
		
		if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
		
        } 
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();

		return pizza;
	}

}

 

 

 

 

/**
 *  奶酪披萨
 */
public class CheesePizza extends Pizza {
	public CheesePizza() {
		name = "Cheese Pizza";
		dough = "Regular Crust";
		sauce = "Marinara Pizza Sauce";
		toppings.add("Fresh Mozzarella");
		toppings.add("Parmesan");
	}
}
 

 

 

 

/**
 *  香肠披萨
 */
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");
	}
}
 

 

OK,披萨算是做好了,现在可以吃了,但之后需求变化,需要添加素披萨(VeggiePizza),并且香肠披萨(PepperoniPizza)销量不好,不在生产,这时就的修改代码。

此时可以想到前面提到的编程原则:对扩展开放,对修改关闭。 那好,简单工厂模式可以登场了,修改后代码如下:

 

 

 

 

/**
 *  素披萨
 */
public class VeggiePizza extends Pizza {
	public VeggiePizza() {
		name = "Veggie Pizza";
		dough = "Crust";
		sauce = "Marinara sauce";
		toppings.add("Shredded mozzarella");
		toppings.add("Grated parmesan");
		toppings.add("Diced onion");
		toppings.add("Sliced mushrooms");
		toppings.add("Sliced red pepper");
		toppings.add("Sliced black olives");
	}
}
 

 

 

 

 

/**
 * 披萨店
 *
 */
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;
	}

}
 

 

 

 

/**
 * 简单披萨工厂
 */
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;
	}
}
 

 

 

/**
 *  披萨测试
 */
public class PizzaTestDrive {
 
	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");
 
		pizza = store.orderPizza("veggie");
		System.out.println("We ordered a " + pizza.getName() + "\n");
	}
}
 

 

 

 

这里修改了披萨店,增加了披萨工厂,披萨以后不需要在关注怎么产披萨,直接告诉工厂去生产就OK。

好,这里我们可以看出来,简单工厂模式是如此的简单,总结下简单工厂模式:其实就是将变化的代码进行封装,且封装在一个类中,这样,当需要变化的时候,我们只要关注一个类就行了,

OK,在这里,简单工厂模式貌似就不像是一种模式,更像是一种编程习惯:对于变化的代码,尽量封装下,可以封装成方法,在这里只不过封装到一个类中了

 

0
1
分享到:
评论

相关推荐

    c++设计模式-工厂方法模式

    描述中的“创建型模式-工厂方法模式-最简单的源码-qt工程”表明,这个压缩包可能包含了一个基于Qt框架的C++项目,该项目展示了工厂方法模式的简单应用。Qt是一个跨平台的应用程序开发框架,广泛用于GUI编程,但也...

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    java设计模式----抽象工厂模式

    java设计模式----抽象工厂模式,简单工厂模式代码 代码内部

    北风网-设计模式-简单工厂模式ppt

    简单工厂模式是面向对象设计模式中的一种,它属于创建型模式,主要解决的是在系统中如何创建对象的问题。设计模式是软件开发中的经验总结,旨在提高代码的可重用性、可读性和可维护性。 在简单工厂模式中,一个工厂...

    java设计模式--工厂模式

    Java设计模式中的工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。工厂模式的核心思想是将对象的创建过程封装起来,使得创建过程独立于使用过程,从而提高了代码的可扩展性和可维护性。在HeadFirst...

    设计模式-简单工厂模式-例题

    ### 设计模式——简单工厂模式解析与应用实例 #### 一、简单工厂模式概述 简单工厂模式(Simple Factory Pattern)是一种常用的创建型设计模式。它提供了一种方式来封装对象的创建过程,使得整个系统更加灵活,...

    设计模式-简单工厂源码

    C++设计模式-创建型模式-简单工厂模式源码

    设计模式-工厂模式

    工厂模式是设计模式中的一个基础且重要的部分,它属于创建型设计模式,主要用于封装对象的创建过程,使得客户端不必关心具体的实现细节,提高了代码的可扩展性和可维护性。 工厂模式主要有三种形式:简单工厂模式、...

    一例读懂设计模式-单例模式、简单工厂模式.zip

    本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...

    设计模式----工厂模式

    1. **简单工厂模式**(Simple Factory Pattern):由一个静态方法或单例类负责创建对象,适用于对象种类较少且不会频繁变动的情况。 2. **工厂方法模式**(Factory Method Pattern):定义一个创建对象的接口,让...

    设计模式-简单工厂模式

    简单工厂模式是软件设计模式中的一种基础模式,它属于创建型模式,主要解决对象的创建问题,降低了系统与具体创建对象之间的耦合度。在这个模式中,有一个名为“工厂”的类,负责创建对象,客户端通过调用工厂的方法...

    设计模式-工厂方法模式

    工厂方法模式是设计模式中的创建型模式,它提供了一种创建对象的最佳方式。在这个模式中,一个类(称为工厂类)不再直接实例化具体的产品,而是定义一个接口或抽象类,由子类来决定实例化哪一个类。这样做的好处在于...

    设计模式--工厂模式java例子

    在这些模式中,工厂模式尤为突出,它是一种创建型设计模式,为对象的创建提供了抽象接口,使得代码无需直接实例化具体类,而是通过工厂方法来创建对象。 在Java编程语言中,工厂模式的应用广泛且实用。它主要分为三...

    java设计模式-工厂模式

    Java设计模式中的工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时,它不会直接创建,而是调用一个工厂对象来完成创建工作。这种模式的核心在于封装了对象...

    设计模式-工厂模式 Java源码

    在Java编程语言中,工厂模式通常分为简单工厂模式、工厂方法模式和抽象工厂模式三种类型。这些模式都是围绕着一个中心思想:将对象的实例化过程封装起来,使代码更加灵活且易于维护。 1. **简单工厂模式**: 简单...

    设计模式-简单工厂模式-披萨店C#语言版

    简单工厂模式是软件设计模式中的一种,它属于创建型模式,旨在提供一个统一的接口,用来创建一组相关或相互依赖的对象。在这个例子中,我们关注的是如何使用C#语言实现这个模式,特别是在披萨店的场景下。 在披萨店...

Global site tag (gtag.js) - Google Analytics