简单工厂模式 、工厂方法模式、
简单工厂模式:
解决的问题:在更改(需要创建的对象)对象的类时,可能会产生对创建对象的修改,由于创建对象没有集中起来,所以更改起来十分麻烦。运用工厂模式可以有效的解决这一问题。
将创建对象的过程提取出来,放到一个类中,这个类就是工厂类;
这样做使程序 降低耦合,增加可拓展性
例子:
//简单工厂类
public class SimpleFactory {
//更加 orderType 返回对应的 Pizza 对象
public Pizza createPizza(String orderType) {
Pizza pizza = null;
System.out.println("使用简单工厂模式"); if (orderType.equals("greek")) {
pizza = new GreekPizza();
pizza.setName(" 希腊披萨 ");
} else if (orderType.equals("cheese")) { pizza = new CheesePizza();
pizza.setName(" 奶酪披萨 ");
} else if (orderType.equals("pepper")) { pizza = new PepperPizza();
pizza.setName("胡椒披萨");
}
return pizza;
}
工厂方法模式:
把获取对象的方法写成抽象方法,在不同的子类中分别实现这个实现这个方法。
//OrderPizza.java 类
package com.atguigu.factory.factorymethod.pizzastore.order;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;
import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
public abstract class OrderPizza {
//定义一个抽象方法,createPizza , 让各个工厂子类自己实现
abstract Pizza createPizza(String orderType);
// 构造器
public OrderPizza() { Pizza pizza = null;
String orderType; // 订购披萨的类型
do {
orderType = getType();
pizza = createPizza(orderType); //抽象方法,由工厂子类完成
//输出 pizza 制作过程
pizza.prepare(); pizza.bake();
pizza.cut();
pizza.box();
} while (true);
}
// 写一个方法,可以获取客户希望订购的披萨种类
private String getType() { try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in)); System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) { e.printStackTrace(); return "";
}
}
}
package com.atguigu.factory.factorymethod.pizzastore.order;
import com.atguigu.factory.factorymethod.pizzastore.pizza.BJCheesePizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.BJPepperPizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
public class BJOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null; if(orderType.equals("cheese")) {
pizza = new BJCheesePizza();
} else if (orderType.equals("pepper")) { pizza = new BJPepperPizza();
}
// TODO Auto-generated method stub return pizza;
}
}
package com.atguigu.factory.factorymethod.pizzastore.order;
import com.atguigu.factory.factorymethod.pizzastore.pizza.BJCheesePizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.BJPepperPizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.LDCheesePizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.LDPepperPizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
public class LDOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null; if(orderType.equals("cheese")) {
pizza = new LDCheesePizza();
} else if (orderType.equals("pepper")) { pizza = new LDPepperPizza();
}
// TODO Auto-generated method stub return pizza;
}
}
抽象方法:
将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
用哪个工厂就传哪个工厂对象。
package com.atguigu.factory.absfactory.pizzastore.order;
import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza;
//一个抽象工厂模式的抽象层(接口) public interface AbsFactory {
//让下面的工厂子类来 具体实现
public Pizza createPizza(String orderType);
}
package com.atguigu.factory.absfactory.pizzastore.order;
import com.atguigu.factory.absfactory.pizzastore.pizza.BJCheesePizza; import com.atguigu.factory.absfactory.pizzastore.pizza.BJPepperPizza; import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza;
//这是工厂子类
public class BJFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
System.out.println("~使用的是抽象工厂模式~");
// TODO Auto-generated method stub Pizza pizza = null; if(orderType.equals("cheese")) {
pizza = new BJCheesePizza();
} else if (orderType.equals("pepper")){ pizza = new BJPepperPizza();
}
return pizza;
}
}
package com.atguigu.factory.absfactory.pizzastore.order;
import com.atguigu.factory.absfactory.pizzastore.pizza.LDCheesePizza; import com.atguigu.factory.absfactory.pizzastore.pizza.LDPepperPizza; import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza;
public class LDFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
System.out.println("~使用的是抽象工厂模式~"); Pizza pizza = null;
if (orderType.equals("cheese")) { pizza = new LDCheesePizza();
} else if (orderType.equals("pepper")) { pizza = new LDPepperPizza();
}
return pizza;
}
}
//OrderPizza.java
package com.atguigu.factory.absfactory.pizzastore.order;
import java.io.BufferedReader;
import java.io.IOException; import java.io.InputStreamReader;
import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza;
public class OrderPizza {
AbsFactory factory;
// 构造器
public OrderPizza(AbsFactory factory) { setFactory(factory);
}
private void setFactory(AbsFactory factory) { Pizza pizza = null;
String orderType = ""; // 用户输入
this.factory = factory; do {
orderType = getType();
// factory 可能是北京的工厂子类,也可能是伦敦的工厂子类
pizza = factory.createPizza(orderType); if (pizza != null) { // 订 购 ok
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("订购失败"); break;
}
} while (true);
}
// 写一个方法,可以获取客户希望订购的披萨种类
private String getType() { try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in)); System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) { e.printStackTrace(); return "";
}
}
}