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

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

阅读更多

接到工厂讲,现在披萨店需要建一个原料工厂(原料包括:酱料,芝士,蔬菜,面团,腊肠等披萨原料),以免加盟店采用劣质原料,原料生产之后运送到各家加盟店,而且对于不同区域纽约,芝加哥等地的原料也不同。

OK,上代码

 

 

/**
 *  披萨原料工厂
 */
public interface PizzaIngredientFactory {
 
	/**
	 * 生产面团
	 */
	public Dough createDough();
	
	/**
     * 生产酱料
     */
	public Sauce createSauce();
	
	/**
     * 生产奶酪
     */
	public Cheese createCheese();
	
	/**
     * 生产蔬菜
     */
	public Veggies[] createVeggies();
	
	/**
     * 生产意大利式辣香肠
     */
	public Pepperoni createPepperoni();
	
	/**
     * 生产蛤蚌
     */
	public Clams createClam();
 
}
 

 

 

/**
 *  纽约披萨原料工厂,对于原料家族的每一种原料都提供纽约的版本
 */
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
 
	public Dough createDough() {
		return new ThinCrustDough();
	}
 
	public Sauce createSauce() {
		return new MarinaraSauce();
	}
 
	public Cheese createCheese() {
		return new ReggianoCheese();
	}
 
	public Veggies[] createVeggies() {
		Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() };
		return veggies;
	}
 
	public Pepperoni createPepperoni() {
		return new SlicedPepperoni();
	}

	public Clams createClam() {
		return new FreshClams();
	}
}

 

 

 

public abstract class Pizza {
	String name;

	//每个披萨要用到的原料
	Dough dough;
	Sauce sauce;
	Veggies veggies[];
	Cheese cheese;
	Pepperoni pepperoni;
	Clams clam;

	/**
	 * 声明为抽象,收集披萨所需原料,而这些原料来自于工厂
	 */
	abstract void prepare();

	void bake() {
		System.out.println("Bake for 25 minutes at 350");
	}

	void cut() {
		System.out.println("Cutting the pizza into diagonal slices");
	}

	void box() {
		System.out.println("Place pizza in official PizzaStore box");
	}

	void setName(String name) {
		this.name = name;
	}

	String getName() {
		return name;
	}

	public String toString() {
		//打印披萨代码
	}
}

 

 

 

/**
 *  奶酪披萨
 */
public class CheesePizza extends Pizza {
	PizzaIngredientFactory ingredientFactory;
 
	/**
	 * @param 传入原料工厂,生产出不同区域的原料
	 */
	public CheesePizza(PizzaIngredientFactory ingredientFactory) {
		this.ingredientFactory = ingredientFactory;
	}
 
	/**
	 * 原料由此而来
	 */
	void prepare() {
		System.out.println("Preparing " + name);
		dough = ingredientFactory.createDough();
		sauce = ingredientFactory.createSauce();
		cheese = ingredientFactory.createCheese();
	}
}

 

 

 

/**
 *  纽约披萨点
 */
public class NYPizzaStore extends PizzaStore {
 
	protected Pizza createPizza(String item) {
		Pizza pizza = null;
		PizzaIngredientFactory ingredientFactory = 
			new NYPizzaIngredientFactory();
 
		if (item.equals("cheese")) {
  
			pizza = new CheesePizza(ingredientFactory);
			pizza.setName("New York Style Cheese Pizza");
  
		} else if (item.equals("veggie")) {
 
			pizza = new VeggiePizza(ingredientFactory);
			pizza.setName("New York Style Veggie Pizza");
 
		} else if (item.equals("clam")) {
 
			pizza = new ClamPizza(ingredientFactory);
			pizza.setName("New York Style Clam Pizza");
 
		} else if (item.equals("pepperoni")) {

			pizza = new PepperoniPizza(ingredientFactory);
			pizza.setName("New York Style Pepperoni Pizza");
 
		} 
		return pizza;
	}
}

 

 

 

OK,代码就贴这些主要的,由于比较多,所以这次代码打包放在附件当中,需要的可以下载。

抽象工厂定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 抽象工厂定义了一个接口,这个接口包含一组方法用来生产产品,而它的具体子类则实现图同的产品。

其实抽象工厂里面就是一个个抽象方法,每个方法用来生产一个产品,每一个可以看成是一个个工厂方法模式(定义了一个抽象方法,让其子类来实现生产出一个产品),可以看出抽象工厂需要一个大接口,很多抽象方法,用来创建整个产品家族,而工厂方法只需要一个抽象方法就可以了。这个是利用了依赖倒置原则:要依赖抽象,不要依赖于实现

这下总共讲了3个工厂了,下面总结下工厂:

1.所有的工厂都是用来封装对象的创建,达到解耦的作用。

2.工厂方法使用继承,把对象的创建延迟到子类实现,子类实现工厂方法来创建对象

3.抽象工厂使用对象组合,工厂的大接口所暴露的一个个方法来实现对象家族

 

OK,结束,本来准备写下单例模式的,不过比较晚了,每次都在公司加班写的,那就下次再写单例了

 

0
1
分享到:
评论
2 楼 jijun87120681 2011-11-14  
shenchengxuyuan 写道
很好,看完了,挺清晰。
希望您有空能用反射机制和依赖倒置原则写一个web程序。
我很想学习反射机制的应用。谢谢~


引用


用反射机制和依赖倒置原则,呵,这个spring已经做好了,等设计模式写完后,有空我就再研究下spring源代码,到时候大家一起学习啦,呵呵
1 楼 shenchengxuyuan 2011-11-08  
很好,看完了,挺清晰。
希望您有空能用反射机制和依赖倒置原则写一个web程序。
我很想学习反射机制的应用。谢谢~

相关推荐

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

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

    创建型设计模式----抽象工厂模式

    抽象工厂模式是创建型设计模式的一种,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定具体类。这种模式的核心在于它允许客户端代码与具体实现细节解耦,使得更换一个产品族变得更为容易。...

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)

    设计模式--抽象工厂模式实现多数据库连接

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...

    设计模式 - 抽象工厂模式

    设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...

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

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

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...

    设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

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

    抽象工厂模式是设计模式中的一种,它属于创建型模式,主要解决的是当系统有多个产品族,而每个产品族又有多个具体产品时,如何组织代码的问题。在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于...

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

    java常用设计模式-抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建...

    3.java设计模式-创建者模式-抽象工厂模式.pdf

    抽象工厂模式是创建型设计模式中的一种,用于创建一系列相关或相互依赖的对象,而无需指定其具体类。抽象工厂模式强调产品的系列,对于有多个产品等级结构的系统非常有用。在抽象工厂模式中,一个工厂负责创建多个...

    设计模式--抽象工厂

    抽象工厂模式通常由以下几个角色构成: 1. **抽象工厂(Abstract Factory)**:定义一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在不同的实现中,这个接口会创建出不同系列的产品。 2. **...

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

    抽象工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定它们的具体类。在Java编程中,抽象工厂模式通常用于实现跨平台或者跨框架的接口,使得系统...

    抽象工厂-设计模式

    抽象工厂-设计模式-主要介绍怎么样创建抽象工厂并实现数据库创建

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

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而具体的对象族由子类决定。这种模式允许系统在不指定具体产品的前提下,能够创建一系列相关或相互依赖的对象,同时避免了硬编码所造成的...

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

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

    Java设计模式-抽象工厂

    抽象工厂模式是设计模式中的一种结构型模式,它提供了一个创建对象族的接口,但允许子类决定实例化哪一个类。这个模式使代码能够独立于实际的产品实现,增强了代码的可扩展性和灵活性。 ### **1. 模式概念** 抽象...

    PHP5设计模式-抽象工厂模式实现

    PHP实现的抽象工厂模式,大家可以下载来参考学习下。

Global site tag (gtag.js) - Google Analytics