定义
工厂方法模式定义了一个创建对象的接口,但由子类来决定要实例化的类是哪一个。工厂方法让类那实例化推迟到子类。
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
设计原则
要依赖抽象,不要依赖具体类。
代码demo
原材料接口
public abstract class Pizza {
String name;
public void prepare(){
System.out.println("prepare pizza-------");
}
public void back(){
System.out.println("back pizza -------");
}
public void cut(){
System.out.println("cut pizza ------");
}
abstract String getName();
}
原材料的子实现类
public class CheesePizza extends Pizza{
public CheesePizza(String name) {
super.name=name;
}
@Override
public void prepare() {
System.out.println("cheese pizza prepare-------");
}
@Override
public void back() {
System.out.println("cheese pizza back----");
}
@Override
public void cut() {
System.out.println("cheese pizza cut");
}
@Override
String getName() {
return name;
}
}
public class VegglePizza extends Pizza{
public VegglePizza(String name) {
super.name=name;
}
@Override
public void prepare() {
System.out.println("veggle pizza prepare-------");
}
@Override
public void back() {
System.out.println("veggle pizza back----");
}
@Override
public void cut() {
System.out.println("veggle pizza cut");
}
@Override
String getName() {
return name;
}
}
工厂提供者接口
public abstract class PizzaProducter {
// private SimplePizzaFactory simple;
//
// public PizzaProducter(SimplePizzaFactory simple) {
// this.simple=simple;
// }
public Pizza orderPizza(String type){
Pizza p = createPizza(type);
p.prepare();
p.back();
p.cut();
return p;
}
public abstract Pizza createPizza(String type);
}
工厂实现类
public class CheesePizzaProducter extends PizzaProducter{
@Override
public Pizza createPizza(String type) {
Pizza p = null;
if("cheese".equals(type)){
p=new CheesePizza("cheese store ");
}else {
p=new VegglePizza("cheese store");
}
return p;
}
}
public class VegglePizzaProducter extends PizzaProducter{
@Override
public Pizza createPizza(String type) {
Pizza p = null;
if("cheese".equals(type)){
p=new CheesePizza("veggle store");
}else{
p=new VegglePizza("veggle store");
}
return p;
}
}
单元测试
public class UnitTest {
public static void main(String[] args) {
// PizzaProducter pp = new PizzaProducter(new SimplePizzaFactory());
// pp.orderPizza("cheesaa");
PizzaProducter p1 = new CheesePizzaProducter();
PizzaProducter p2 = new VegglePizzaProducter();
Pizza pp1 = p1.orderPizza("cheese");
System.out.println("name "+pp1.getName());
Pizza pp2 = p2.orderPizza("cheese");
System.out.println("name "+pp2.getName());
}
}
代码解读
所有的工厂都是用来封装对象的创建。