工厂模式

1.简单工厂

简单工厂其实不是一个设计模式,反而比较像一阵编程习惯,但是却被经常使用。

public interface Pizza {
	void prepare();
	void bake();
	void cut();
	void box();
	
}
public class CheesePizza implements Pizza{

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

	public void bake() {
		// TODO Auto-generated method stub
		
	}

	public void cut() {
		// TODO Auto-generated method stub
		
	}

	public void box() {
		// TODO Auto-generated method stub
		
	}

}
public class ClamPizza implements Pizza{

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

	public void bake() {
		// TODO Auto-generated method stub
		
	}

	public void cut() {
		// TODO Auto-generated method stub
		
	}

	public void box() {
		// TODO Auto-generated method stub
		
	}

}
public class PizzaStore {
	
	SimplePizzaFactory factory;
	
	public PizzaStore(SimplePizzaFactory factory) {
		this.factory = factory;
	}
	
	public Pizza orderPizza(String type) {
         //创建pizza的方法 又工厂控制 如果以后添加新的pizza 这个段代码不需要修改 只需要
        //修改 工厂类即可 因为可能多处用到工厂来 所以只需要修改工厂一处即可
		Pizza pizza = factory.createPizza(type);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
	
}
public class SimplePizzaFactory {
	
	public Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("cheese")) {
			pizza = new CheesePizza();
		}else if(type.equals("clam")) {
			pizza = new ClamPizza();
		}
		return pizza;
	}

}

2 工厂方法模式 :定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。简单工厂方法没有使用接口 直接用的是实现类,这里使用接口。

public abstract class Pizza {
	String name;
	String dough;
	String sauce;
	
	List<String> toppings = new ArrayList<>();
	
	void prepare() {
		System.out.println("Preparing "+name);
		System.out.println("Tossing dough...");
		System.out.println("Adding sauce..");
		System.out.println("Adding toppings:");
		for(int i=0;i<toppings.size();i++) {
			System.out.println("  "+toppings.get(i));
		}
	}
		
	void bake() {
		System.out.println("Bake for 25 minutes at 350");
	}
	
	void cut() {
		System.out.println("Cutting the pizza into pizza ");
	
	}
	
	void box() {
		System.out.println("Place pizza in offical PizzaStore box");
	}
	
	
	public String getName() {
		return name;
	}
		
}
public abstract class PizzaStore {
	
	
	public PizzaStore() {
		
	}
	
	public Pizza orderPizza(String type) {
        //定义方法 有具体类实现
		Pizza pizza = createPizza(type);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}

	protected  abstract Pizza createPizza(String type) ;
	
}
public class NYPizzaStore extends PizzaStore{

	@Override
	public Pizza createPizza(String type) {
		Pizza pizza = null;
		if(type.equals("ny")) {
			pizza = new NyStyleCheesePizza();
		}else if(type.equals("chicago")) {
			pizza = new ChicagoStyleChessPizza();
		}
		return pizza;
	}

}

public class NyStyleCheesePizza extends Pizza{

	public NyStyleCheesePizza() {
		name = "NY Style Sauce and Cheese Pizza";
		dough = "Thin Crust Dough";
		sauce = "Marinara Sauce";
		toppings.add("Grated Reggiano Cheese");
	}
	
}

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

这些是pizza原料的接口

public interface Cheese {

}
public interface Clams {

}

public interface Dough {

}
public interface Pepperoni {

}
public interface Sauce {

}
public interface Veggies {

}

原料工厂接口 

public interface PizzaIngredientFactory {
	Dough createDough();
	Sauce createSauce();
	Cheese createCheese();
	Veggies[] createVeggies();
	Pepperoni createPepperoni();
	Clams createClam();

}

原料工厂实现类

public class NyPizzaIngredientFactory implements PizzaIngredientFactory{

	@Override
	public Dough createDough() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Sauce createSauce() {
		// TODO Auto-generated method stub
		return null;
	}

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

	@Override
	public Veggies[] createVeggies() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Pepperoni createPepperoni() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Clams createClam() {
		// TODO Auto-generated method stub
		return null;
	}

}

public abstract class Pizza {
	Dough dough;
	Sauce sauce;
	Cheese sheese;
	Veggies[] veggies;
	Pepperoni pepperoni;
	Clams clams;
	String name;
	
	
	//创建原料实现类
	public abstract void prepare() ;
		
	void bake() {
		System.out.println("Bake for 25 minutes at 350");
	}
	
	void cut() {
		System.out.println("Cutting the pizza into pizza ");
	
	}
	
	void box() {
		System.out.println("Place pizza in offical PizzaStore box");
	}
	
	
	public String getName() {
		return name;
	}
		
}
public class CheesePizza extends Pizza {

	PizzaIngredientFactory ingredientFactory;

	public CheesePizza(PizzaIngredientFactory ingredientFactory) {
		super();
		this.ingredientFactory = ingredientFactory;
	}

	
	//依靠工厂类 创建了一组原料实现类
	@Override
	public void prepare() {
		dough = ingredientFactory.createDough();
		sauce = ingredientFactory.createSauce();
		sheese = ingredientFactory.createCheese();
		veggies = ingredientFactory.createVeggies();
		pepperoni = ingredientFactory.createPepperoni();
		clams = ingredientFactory.createClam();

	}

}

注意点:

抽象工厂的方法经常以工厂方法的方式实现。抽象工厂的任务是定义一个负责创建一组产品的接口,这个接口内的每个方法都负责创建一个具体产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法,所以在抽象工厂中利用工厂方式实现生产方法是相当自然的做法。工厂方法模式通常一个接口 直接创建产品.。抽象工厂模式通常有多个接口,创建出多个组件,然后在组合出产品。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值