设计模式: 自己手动写一个工厂模式(整合工厂方法模式和抽象工厂模式)

本文介绍了工厂模式的两种常见形式——工厂方法模式和抽象工厂模式。工厂方法模式通过子类决定要创建的对象类型,实现了对象创建的封装;而抽象工厂模式则用于创建相关对象家族,不依赖具体类。通过代码示例展示了这两种模式在实际应用中的类图和结构,以及如何创建不同风格的披萨。
摘要由CSDN通过智能技术生成

 工厂模式: 所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象的创建过程封装的目的。

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

抽象工厂模式提供一个接口,用来创建相关或依赖对象的家族,而不需要明确指定具体类。

工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。

抽象工厂使用对象组合: 对象的创建被实现在工厂接口所暴露出来的方法中。抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。


下面是工厂方法的类图



下面是工程的结构图


AbstractFactorys包下的类主要体现抽象工厂模式的运用

factoryMethods 包下的类主要体现工厂方法模式的运用


源代码如下:

先给出 factoryMethods 下的代码

package factoryMethods;

import AbstractFactorys.PizzaIngredientFactory;

/**
 * 披萨商店抽象类 超类
 * @author Arvon
 *
 */
public abstract class PizzaStore {
	PizzaIngredientFactory ingredientFactory;
	public void orderPizza(String type,PizzaIngredientFactory ingredientFactory){
		Pizza pizza;
		pizza = createPizza(type,ingredientFactory);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
	}
	/**
	 * 生产披萨  工厂方法 由子类来实现
	 * @param type
	 * @return
	 */
	public abstract Pizza createPizza(String type,PizzaIngredientFactory ingredientFactory);
	
	
}


package factoryMethods;

import AbstractFactorys.PizzaIngredientFactory;

/**
 * 芝加哥披萨商店 负责生产披萨
 * @author Administrator
 *
 */
public class ChicagoPizzaStore extends PizzaStore {
	
	@Override
	public Pizza createPizza(String type,PizzaIngredientFactory ingredientFactory) {
		if(type.equals(Constant.CHEESE))
			return new ChicagoStyleCheesePizza(ingredientFactory);
		else if(type.equals(Constant.VEGGIE))
			return new ChicagoStyleVeggiePizza(ingredientFactory);
		else return null;
	}

}



package factoryMethods;

import AbstractFactorys.PizzaIngredientFactory;

/**
 * 纽约披萨商店 负责生产披萨
 * @author Administrator
 *
 */
public class NYPizzaStroe extends PizzaStore {

	@Override
	public Pizza createPizza(String type, PizzaIngredientFactory ingredientFactory) {
		if(type.equals(Constant.CHEESE))
			return new NYStyleCheesePizza(ingredientFactory);
		else if(type.equals(Constant.VEGGIE))
			return new NYStyleVeggiePizza();
		else return null;
	}
}


package factoryMethods;

import AbstractFactorys.Cheese;
import AbstractFactorys.Veggie;

/**
 * 产品类 超类
 * @author Administrator
 *
 */
public abstract class Pizza {
	String name;
	Veggie veggie;
	Cheese cheese;
	
	
	public abstract void prepare();

	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 void setName(String name) {
		this.name = name;
	}
	
	

}


package factoryMethods;

import AbstractFactorys.PizzaIngredientFactory;

public class ChicagoStyleCheesePizza extends Pizza {
	PizzaIngredientFactory ingredientFactory;
	public ChicagoStyleCheesePizza(PizzaIngredientFactory ingredientFactory) {
		super();
		// TODO Auto-generated constructor stub
		name = "ChicagoStyleCheesePizza";
		this.ingredientFactory = ingredientFactory;
	}

	@Override
	public void prepare() {
		
	}
	
}

package factoryMethods;

import AbstractFactorys.PizzaIngredientFactory;

public class ChicagoStyleVeggiePizza extends Pizza {
	PizzaIngredientFactory ingredientFactory;
	public ChicagoStyleVeggiePizza(PizzaIngredientFactory ingredientFactory) {
		super();
		// TODO Auto-generated constructor stub
		name = "ChicagoStyleVeggiePizza";
		this.ingredientFactory = ingredientFactory;
	}

	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		cheese = ingredientFactory.createCheese();
		veggie = ingredientFactory.createVeggie();
		System.out.println("Preparing " + name);
		System.out.println(cheese.getName());
		System.out.println(veggie.getName());
	}
	
}


package factoryMethods;

import AbstractFactorys.PizzaIngredientFactory;

public class NYStyleCheesePizza extends Pizza {
	PizzaIngredientFactory ingredientFactory;
	public NYStyleCheesePizza(PizzaIngredientFactory ingredientFactory) {
		super();
		name = "NYStyleCheesePizza";
		this.ingredientFactory = ingredientFactory;
	}

	@Override
	public void prepare() {
		cheese = ingredientFactory.createCheese();
		veggie = ingredientFactory.createVeggie();
		System.out.println("Preparing " + name);
		System.out.println(cheese.getName());
		System.out.println(veggie.getName());
	}
	
}


package factoryMethods;

public class NYStyleVeggiePizza extends Pizza {

	public NYStyleVeggiePizza() {
		super();
		// TODO Auto-generated constructor stub
		name = "NYStyleVeggiePizza";
	}

	@Override
	public void prepare() {
		// TODO Auto-generated method stub
		
	}

}

package factoryMethods;

public interface Constant {
	public static final String CHEESE = "cheese";
	public static final String VEGGIE = "veggie";
}


接下来是AbstractFactorys包里的类

package AbstractFactorys;
/**
 * 原料生产工厂 抽象工厂
 * @author Administrator
 *
 */
public interface PizzaIngredientFactory {
	public Cheese createCheese();
	public Veggie createVeggie();
	
}


package AbstractFactorys;
/**
 * 原料生产工厂 具体工厂
 * @author Administrator
 *
 */
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {

	@Override
	public Cheese createCheese() {
		return new Cheese(this);
	}

	@Override
	public Veggie createVeggie() {
		return new Veggie(this);
	}

}


package AbstractFactorys;
/**
 * 原料生产工厂 具体工厂
 * @author Administrator
 *
 */
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {

	@Override
	public Cheese createCheese() {
		// TODO Auto-generated method stub
		return new Cheese(this);
	}

	@Override
	public Veggie createVeggie() {
		// TODO Auto-generated method stub
		return new Veggie(this);
	}

}


package AbstractFactorys;
/**
 * 原料类 超类
 * @author Administrator
 *
 */
public class Ingredient {
	String name;

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

	public String getName() {
		return name;
	}
	
	
}

package AbstractFactorys;
/**
 * 具体的原料
 * @author Administrator
 *
 */
public class Cheese extends Ingredient {

	public Cheese(PizzaIngredientFactory ingredientFactory) {
		name = "cheese from "+ ingredientFactory.getClass().getSimpleName();
		setName(name);
	}
	
}


package AbstractFactorys;
/**
 * 具体的原料
 * @author Administrator
 *
 */
public class Veggie extends Ingredient {

	public Veggie(PizzaIngredientFactory ingredientFactory) {
		name = "veggie from "+ ingredientFactory.getClass().getSimpleName();
	}

}


测试类

package factoryMethods;

import AbstractFactorys.ChicagoPizzaIngredientFactory;
import AbstractFactorys.NYPizzaIngredientFactory;
import AbstractFactorys.PizzaIngredientFactory;

/**
 * 测试类
 * @author Administrator
 *
 */
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PizzaStore mPizzaStore = new NYPizzaStroe();
		PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
		mPizzaStore.orderPizza("cheese", ingredientFactory);
		System.out.println("-----------------------------------");
		ingredientFactory = new ChicagoPizzaIngredientFactory();
		mPizzaStore = new ChicagoPizzaStore();
		mPizzaStore.orderPizza("veggie", ingredientFactory);
		
	}
	

}

测试结果:

Preparing NYStyleCheesePizza
cheese from NYPizzaIngredientFactory
veggie from NYPizzaIngredientFactory
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
-----------------------------------
Preparing ChicagoStyleVeggiePizza
cheese from ChicagoPizzaIngredientFactory
veggie from ChicagoPizzaIngredientFactory
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值