java设计模式 ——工厂模式

工厂模式一般可分为三类:简单工厂模式、抽象工厂模式、工厂方法模式。其中,简单工厂其实不是一个设计模式,反而比较像一种编程习惯。

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

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

抽象工厂创建的是一个产品家族,它的方法经常以工厂方法的方式实现。


简单工厂模式

用一个"工厂”类来处理创建对象的细节,实际使用时通过该“工厂”类的方法获取实例。

产品

public interface Pizza {
	void prepare();
}

public class VeggiePizza implements Pizza {
	public void prepare() {
		System.out.println("VeggiePizza prepare");
	}

}

public class CheesePizza implements Pizza {
	public 	void prepare() {
		System.out.println("CheesePizza prepare");
	}
}

简单工厂类

public class SimplePizzaFactory {
	public Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("CheesePizza")) {
			pizza = new CheesePizza();
		} else if(type.equals("VeggiePizza")) {
			pizza = new VeggiePizza();
		}
		return pizza;
	}
}
通过简单工厂获取实例
public class PizzaStore {
	SimplePizzaFactory factory;
	
	public PizzaStore(SimplePizzaFactory factory) {
		this.factory = factory;
	}
	
	public Pizza orderPizza(String type) {
		Pizza pizza = factory.createPizza(type);
		pizza.prepare();
		return pizza;
	}
}

工厂方法模式

不再由一个对象负责所有具体类的实例化,而是将工厂方法设置成”抽象“的,由抽象工厂的子类来负责具体类的实例化。

产品

public abstract class Pizza {
	private String name;
	
	abstract void prepare();
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
}
public class CheesePizza extends Pizza {
	public CheesePizza() {
		this.setName("CheesePizza");
	}
	
	public 	void prepare() {
		System.out.println("CheesePizza prepare");
	}
}
public class VeggiePizza extends Pizza {
	
	public VeggiePizza() {
		this.setName("VeggiePizza");
	}
	
	public void prepare() {
		System.out.println("VeggiePizza prepare");
	}
}

工厂

//工厂方法模式
public abstract class PizzaStore {
	public Pizza orderPizza(String type) {
		//调用实例化产品类的抽象方法
		Pizza pizza = createPizza(type);
		pizza.prepare();
		return pizza;
	}
	
	//用工厂方法创建对象,由子类来负责实例化
	abstract Pizza createPizza(String type);
}

public class NYStylePizzaStore extends PizzaStore {

	Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("CheesePizza")) {
			pizza = new CheesePizza();
		} else if(type.equals("VeggiePizza")) {
			pizza = new VeggiePizza();
		}
		return pizza;
	}

}
public class ChicagoStylePizzaStore extends PizzaStore {

	Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("CheesePizza")) {
			pizza = new CheesePizza();
		} else if(type.equals("VeggiePizza")) {
			pizza = new VeggiePizza();
		}
		return pizza;
	}
}

测试

public class Test {
	public static void main(String[] args) {
		NYStylePizzaStore store = new NYStylePizzaStore();
		Pizza pizza = store.orderPizza("CheesePizza");
		System.out.println("Pizza: " + pizza.getName());
	}
}
输出
CheesePizza prepare
Pizza: CheesePizza


抽象工厂模式

先为工厂定义一个接口,然后具体工厂实现该接口。

工厂

public interface PizzaIngredientFactory {
	public Dough createDough();
	public Sauce createSauce();
	//....
}

public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
	public Dough createDough() {
		return new ThinCrustDough();
	}

	public Sauce createSauce() {
		return new MarinaraSauce();
	}
}

参考:《Head First 设计模式》


猜你喜欢

转载自blog.csdn.net/qq_34902684/article/details/79463835