工厂模式,是我们设计模式中比较简单的一种设计模式,但是其简单工厂-工厂方法-抽象工厂方法三则的区别与联系往往搞的程序员晕头转向;
简单工厂-提供了一个抽象类下不同具体对象创建的封装;
-----具体的披萨生产封装(榴莲味、芝士味、腊肠味)
工厂方法-定义一个创建对象的抽象,将具体的对象创建交给子类;
----不同区域(芝加哥纽约)生产略显不同的各种口味披萨
抽象工厂-通过抽象工厂接口,可以创建产品家族
----不同地域(芝加哥,纽约)生产不同的披萨的原材料(原材料种类细微差别 冻榴莲、新鲜榴莲...)
简单工厂模式:一个披萨店提供不同口味的披萨饼,披萨生产过程:原料准备、烘焙、切片、包装
1、将变化封装到工厂中,修改代码则修改工厂中的代码;
2、工厂可以生产多种产品,不局限于一种类型
3、给简单工厂提供静态方法,避免了实例化对象,也使得不能通过继承来改变创建方法的行为;
public class SimplePizzeFactory{
public static Pizza createPizza(String type){
Pizza pizza = null;
if("cheese".equals(type)){ //奶酪披萨
pizza = new CheesePizza();
}else if("pepperoni".equals(type)){ //腊香肠披萨
pizza = new CheesePizza();
}else if("veggie".equals(type)){ //素食披萨
pizza = new CheesePizza();
}
}
//todo 创建快餐
}
//具体的披萨接口
public interface Pizze{
public void prepare();
public void bake();
public void cut();
public void box();
}
工厂方法模式:
前提: 随着业务发展,简单工厂支持的不同口味的披萨的准备、烘焙、切片、包装不能完全满足业务的扩张了;
增加了很多的加盟店,需要提供下订单和配送服务,而所有的加盟店的下订单和配送服务是不变的,
变化的是每个加盟店创建披萨的过程()
定义抽象类PizzaStore(披萨商店)将createPizza() 创建披萨的方法用户可继承、下订单和配货则进行统一的实现;
含义:定义一个创建对象的接口,但由子类决定要实例化类的哪一个,工厂方法让类把实例化推迟到子类;
与简单工厂方法的区别:
①简单工厂把全部事情都处理完了
②工厂方法,将具体实现交给子类;
//披萨商店
public abstract class PizzaStore{
//创建披萨
public void createPizza();
//下单
private void orderPizza();
//配送
private void distributionPizza();
}
//具体实现类
public class NYPizzaStore entends PizzaStore{
//创建披萨
public void createPizza();
}
//具体实现类
public class ChicagoPizzaStore entends PizzaStore{
//创建披萨
public void createPizza();
}
//PIZZA 实现更多纽约和芝加哥风味的不同种类披萨;
抽象工厂方法:
前提:随着业务发展,披萨店,需要增加统一的原料生产与加工,以确保原料的质量;
原料工厂在不同的区域实现相同稍带区别口味的披萨产品的原料生产;有面团、酱料、芝士等;
含义:通过抽象工厂所提供的接口,可以创建产品的家族(相关和依赖对象的家族);利用这些接口书写代码,我们将从实际工厂解耦,
以便在不同的上下文中实现各式各样的工厂,制造不同的产品;
与工厂方法比较:
工厂方法:通过继承实现子类实现具体创建对象; 创建具体的产品;
抽象工厂方法:通过对象的组合实现对象方法; 通过内部的工厂方法进行具体产品的创建;
具体实现:改变原来的Pizza类的准备方法;
//第一步:定义接口:创建原料工厂(如果每个工厂实例都有通用的机制需要实现,可以变为抽象类)
public interface PizzaIngredientFactory{
//面团
public Dough createDough();
//酱料
public Sauce createSauce();
//蛤蛎
public Clam createClam();
}
/**
*第二步:
* 1,为每一个区域创建一个工厂,的子类实现具体创建方法
* 2,实现一组原料类供工厂使用 的原料家族
* 3,将新的原料工厂整合进旧的PizzaStore代码中
*/
public class NYPizzaIngredientFactory entends PizzaIngredientFactory{
//面团
public Dough createDough(){
return new CrustDough();
}
//酱料
public Sauce createSauce(){
}
//芝士
public Clam createClam(){
//纽约靠海有新鲜的clam, 芝加哥就必须冷冻FrozenClams();
return new FreshClam();
}
}
/**
*第三步:将新的原料工厂整合进旧的PizzaStore代码中
* 1,修改pizza为抽象方法,其他方法不变, prepare变为抽象方法;
*/
public abstract class Pizze{
public abstract void prepare();
public void bake();
public void cut();
public void box();
}
public class CheesePizze extends Pizze{
PizzaIngredientFactory ingredientFactory;
void prepare(){
//获取各种原材料
Dough dough = ingredientFactory.createDough();
}
}