Java设计模式——工厂模式

来源:互联网 发布:大数据分析师就业形势 编辑:程序博客网 时间:2024/05/20 06:36

简单工厂

先来看看它的组成:

     1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。      2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。      3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 

例:

工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。

来看下它的组成:

   1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。    2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。    3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。    4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。 

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。可以看出工厂角色的结构也是符合开闭原则的!

在简单工厂模式中,新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽象工厂角色中,要么在客户程序中将具体工厂角色写死(就象上面的例子一样)。而且产品对象创建条件的改变必然会引起工厂角色的修改

抽象工厂模式

抽象工厂模式可以说是简单工厂模式的扩展,它们主要的区别在于需要创建对象的复杂程度上。
在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族,这些产品族互相之间有关联。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。

例:

package com.cn.gaoyan;//Dough接口public interface Dough {}
package com.cn.gaoyan;//Dough子类public class NYDough implements Dough{    public NYDough(){        System.out.println("*****NYDough*****");    }}
package com.cn.gaoyan;//Dough子类public class ChicagoDough implements Dough{    public ChicagoDough(){        System.out.println("*****ChicagoDough*****");    }}
package com.cn.gaoyan;//Cheese接口public interface Cheese {}
package com.cn.gaoyan;//Cheese子类public class NYCheese implements Cheese{    public NYCheese(){        System.out.println("*****NYCheese*****");    }}
package com.cn.gaoyan;//Cheese子类public class ChicagoCheese implements Cheese{    public ChicagoCheese(){        System.out.println("*****ChicagoCheese*****");    }}
package com.cn.gaoyan;//原料工厂(抽象工厂),使用Dough、Cheese接口public interface PizzaIngredientFactory {    public Dough createDough();    public Cheese createCheese();}
package com.cn.gaoyan;//具体工厂public class NYPizzaIngredientFactory implements PizzaIngredientFactory{    public Dough createDough(){        Dough dough= new NYDough();        return dough;    }    public Cheese createCheese(){        Cheese cheese = new NYCheese();        return cheese;    }}
package com.cn.gaoyan;//具体工厂public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory{    public Dough createDough(){        Dough dough= new ChicagoDough();        return dough;    }    public Cheese createCheese(){        Cheese cheese = new ChicagoCheese();        return cheese;    }}
package com.cn.gaoyan;//Pizza接口,使用原料工厂生产出来的原料,以及原料工厂public abstract class Pizza {    PizzaIngredientFactory ingredientFactory;    Dough dough;    Cheese cheese;    public abstract void prepare();    public void bake(){        System.out.println("#####bake for 25 minutes in 350");    }    public void box(){        System.out.println("#####place pizza in a office pizzzaBox");    }}
package com.cn.gaoyan;//具体Pizzapublic class CyPizza extends Pizza{    public CyPizza(PizzaIngredientFactory ingredientFactory){        this.ingredientFactory = ingredientFactory;    }    @Override    public void prepare() {        // TODO Auto-generated method stub        System.out.println("this is CyPizza");        dough = ingredientFactory.createDough();        cheese = ingredientFactory.createCheese();    }}
package com.cn.gaoyan;//具体Pizzapublic class CgPizza extends Pizza{    public CgPizza(PizzaIngredientFactory ingredientFactory){        this.ingredientFactory=ingredientFactory;    }    @Override    public void prepare() {        // TODO Auto-generated method stub        System.out.println("this is CgPizza");        dough = ingredientFactory.createDough();        cheese = ingredientFactory.createCheese();    }}
package com.cn.gaoyan;//抽象PizzaStore ,使用Pizza,以及原料工厂public abstract class PizzaStore {    protected abstract Pizza creatPizza(String style);    public void orderPizza(String style){        Pizza pizza;        pizza = creatPizza(style);        pizza.prepare();        pizza.bake();        pizza.box();    }}
package com.cn.gaoyan;//具体PizzaStore public class NYPizzaStore extends PizzaStore{    @Override    protected Pizza creatPizza(String style) {        // TODO Auto-generated method stub        Pizza pizza = null;        PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();        if(style.equals("cy")){            pizza = new CyPizza(ingredientFactory);        }        else if(style.equals("cg")){            pizza = new CgPizza(ingredientFactory);        }        return pizza;    }}
package com.cn.gaoyan;//具体PizzaStore public class ChicagoPizzaStore extends PizzaStore{    @Override    protected Pizza creatPizza(String style) {        // TODO Auto-generated method stub        Pizza pizza=null;        PizzaIngredientFactory ingredientFactory = new ChicagoPizzaIngredientFactory();        if(style.equals("cy")){            pizza = new CyPizza(ingredientFactory);        }        else if(style.equals("cg")){            pizza = new CgPizza(ingredientFactory);        }        return pizza;    }}
package com.cn.gaoyan;//测试,main()public class MainTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        PizzaStore pizzaStore = new ChicagoPizzaStore();        pizzaStore.orderPizza("cg");    }}

运行结果:

这里写图片描述

0 0
原创粉丝点击