工厂模式
工厂模式:将创建对象实例的工作交给工厂来完成!
三种实现方式 :简单工厂模式、工厂方法模式、抽象工厂模式
1.简单工厂模式
创建所需的实体类
public abstract class Pizza {
protected String name;//披萨名字
public void setName(String name) {
this.name = name;
}
//准备原材料,不同种类披萨原材料不同,因此写成抽象的
public abstract void prepare();
public void bake() {
System.out.println(name+" baking;");
}
public void cut() {
System.out.println(name+" cutting");
}
public void box() {
System.out.println(name+" boxing");
}
}
public class GreekPizza extends Pizza {
@Override
public void prepare() {
System.out.println("准备希腊披萨的原材料!");
}
}
public class CheesePizza extends Pizza{
@Override
public void prepare() {
System.out.println("准备奶酪披萨的原材料!");
}
}
创建工厂类
//简单的披萨工厂
public class SimplePizzaFactory {
//静态方法 创建对应类型的披萨
public static Pizza createPizza(String pizzaType) {
Pizza pizza = null;
if (pizzaType.equals("greek")) {
pizza = new GreekPizza();
pizza.setName("GreekPizza");
} else if (pizzaType.equals("cheese")) {
pizza = new CheesePizza();
pizza.setName("Cheese");
} else {
System.out.println("披萨种类不存在!");
}
return pizza;
}
}
public class PizzaStore {
//订购一个披萨
public void orderPizza(String pizzaType) {
Pizza pizza = null;
//通过简单披萨工厂创建实例对象
pizza = SimplePizzaFactory.createPizza(pizzaType);
if (pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}
}
上述创建简单工厂的模式为静态工厂,还可以以下面的方式创建工厂
//简单的披萨工厂
public class SimplePizzaFactory2 {
//创建对应类型的披萨
public Pizza createPizza(String pizzaType) {
Pizza pizza = null;
if (pizzaType.equals("greek")) {
pizza = new GreekPizza();
pizza.setName("GreekPizza");
} else if (pizzaType.equals("cheese")) {
pizza = new CheesePizza();
pizza.setName("Cheese");
}else {
System.out.println("披萨种类不存在!");
}
return pizza;
}
}
public class PizzaStore2 {
//将工厂作为成员
SimplePizzaFactory2 factory;
public PizzaStore2(SimplePizzaFactory2 factory) {
this.factory = factory;
}
public void orderPizza(String pizzaType) {
Pizza pizza = null;
pizza = factory.createPizza(pizzaType);
if (pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}
}
2.工厂方法模式
将创建对象实例的代码放在子类中
创建所需实体类
public class BJCheesePizza extends Pizza{
@Override
public void prepare() {
setName("北京奶酪披萨!");
System.out.println("准备北京奶酪披萨的原材料!");
}
}
public class BJChinesePizza extends Pizza {
@Override
public void prepare() {
setName("北京中国披萨!");
System.out.println("准备北京中国披萨的原料!");
}
}
public class NYCheesePizza extends Pizza{
@Override
public void prepare() {
setName("纽约奶酪披萨");
System.out.println("准备纽约奶酪披萨的原材料!");
}
}
public class NYChinesePizza extends Pizza {
@Override
public void prepare() {
setName("纽约中国披萨!");
System.out.println("准备纽约中国披萨的原料!");
}
}
创建抽象的披萨店
public abstract class PizzaStore {
//抽象的createPizza方法
abstract Pizza createPizza(String type);
public Pizza orderPizza(String type) {
Pizza pizza = null;
//通过createPizza方法创建披萨实例
pizza = createPizza(type);
if (pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
return pizza;
}
}
纽约的披萨店
public class NYPizzaStore extends PizzaStore {
@Override
Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new NYCheesePizza();
} else if (type.equals("chinese")) {
return new NYChinesePizza();
} else {
System.out.println("此种类披萨不存在!");
return null;
}
}
}
北京的披萨店
public class BJPizzaStore extends PizzaStore {
@Override
Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new BJCheesePizza();
} else if (type.equals("chinese")) {
return new BJChinesePizza();
} else {
System.out.println("此种类披萨不存在!");
return null;
}
}
}
主函数
public class Main {
public static void main(String[] args) {
BJPizzaStore bjPizzaStore = new BJPizzaStore();
bjPizzaStore.orderPizza("cheese");
NYPizzaStore nyPizzaStore = new NYPizzaStore();
nyPizzaStore.orderPizza("chineses");
}
}
3.抽象工厂模式
创建抽象工厂
public interface AbstractFactory {
Pizza createPizza(String type);
}
public class BJPizzaFactory implements AbstractFactory {
@Override
public Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new BJCheesePizza();
} else if (type.equals("chinese")) {
return new BJChinesePizza();
} else {
System.out.println("此种类披萨不存在!");
return null;
}
}
}
public class NYPizzaFactory implements AbstractFactory {
@Override
public Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new NYCheesePizza();
} else if (type.equals("chinese")) {
return new NYChinesePizza();
} else {
System.out.println("此种类披萨不存在!");
return null;
}
}
}
public class PizzaStore {
AbstractFactory abstractFactory;
public void PizzaStore() {}
public void setAbstractFactory(AbstractFactory abstractFactory) {
this.abstractFactory = abstractFactory;
}
public Pizza orderPizza(String type) {
Pizza pizza = null;
pizza = abstractFactory.createPizza(type);
if (pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
return pizza;
}
}
主函数
public class Main {
public static void main(String[] args) {
PizzaStore pizzaStore = new PizzaStore();
pizzaStore.setAbstractFactory(new BJPizzaFactory());
pizzaStore.orderPizza("cheese");
PizzaStore pizzaStore2 = new PizzaStore();
pizzaStore2.setAbstractFactory(new NYPizzaFactory());
pizzaStore2.orderPizza("chinese");
}
}