java设计模式——工厂模式二

来源:互联网 发布:我的世界地狱门算法 编辑:程序博客网 时间:2024/06/01 17:25

工厂模式第二篇:”工厂方法”模式

对工厂模式的个人理解:
(1)工厂模式的核心在于“工厂”,通过“工厂类”的“工厂方法”创建“产品”对象(即让工厂方法返回“产品”对象)。工厂方法是“产品类”与“客户类”(需要某种产品的类)之间的桥梁。工厂方法返回一个具体的产品对象,以供客户类使用(往往客户类中含有一个抽象产品类的对象引用——然后将工厂方法返回的具体产品对象赋于该对象引用,在使用该对象引用调用具体产品类的方法)
(2)工厂模式中不一定非得需要把工厂方法写在工厂类中,可以直接把工厂方法封装在客户类中(结合实际想一下:一些客户也可以自己含有生产方法去生产自己想要的东西,而不一定非得去买别人制作成的)。以下的代码根据披萨制作介绍了工厂模式(将工厂方法封装在客户类中):

public  abstract class pizza    //抽象产品类pizza{    //先声明一些pizza类的数据成员;    String name;                            //披萨的名字    String miantuantype;                    //该类型pizza所需要的面的类型    String zuoliaotype;                     //该类型pizza所需要的作料类型    public abstract void prepare();         //抽象方法,定义制作pizza所需的准备工作    public abstract void desc();            //抽象方法,描述该披萨}public class redpizza extends pizza         //具体产品类{    public redpizza()                   //在构造器中初始化继承自父类的数据成员    {        this.name="红披萨";        this.miantuantype="发面";        this.zuoliaotype="淡盐,酱油,芝麻酱";    }    @Override    public void prepare() {        System.out.println("这种披萨类型为:"+this.name);        System.out.println("我需要准备的东西有"+this.miantuantype);    }    @Override    public void desc() {       System.out.println("这是一个红披萨!!!!");    }}public class blackpizza extends pizza           //具体产品类{    public blackpizza()    {        this.name="黑披萨";        this.miantuantype="非发面";        this.zuoliaotype="酱油,味精,糖";    }    @Override    public void prepare() {        System.out.println("这是一个"+name+",需要准备的材料是黑颜料");        System.out.println("需要的面团类型为:"+miantuantype);        System.out.println("需要的作料类型为:"+this.zuoliaotype);    }    @Override    public void desc() {        System.out.println("这是一个黑披萨!!");    }   }public abstract class pizzastore                    //抽象客户类,需要某种特定类型的产品{    pizza pi;    public pizza orderpizza(String type)            //决定提供那种类型的pizza,并且在该方法内对该类型的pizza做一些操作    {                                                //面向接口编程,都肯定会用到上转型和接口回调,即将子类对象传递给父类引用,                                                     //然后让该引用调用子类中重写的父类的方法(或继承自父类的方法)        pi=pizzamake(type);                         //将工厂方法产生的“具体产品”类的对象赋于抽象产品类的对象引用(上转型对象)        pi.desc();        pi.prepare();        return pi;    }    abstract pizza pizzamake(String type);      //pizza的制造工厂方法,根据传递进来的参数决定该方法返回那种类型的pizza                            ``````                    //将工厂方法封装在"客户类"中!!!!!}public class pizzamaker1 extends pizzastore         //具体客户类{    @Override    pizza pizzamake(String type) {        if(type=="红披萨")            return new redpizza();        else if(type=="黑披萨")            return new blackpizza();        else         {            System.out.println("对不起,本店没有您想要的这种pizza");            return null;        }    } }public class test {    public static void main(String[] args) {        // TODO code application logic here        pizzastore pizzamaker01=new pizzamaker1();          //实例化一个“具体客户”对象并赋于抽象客户的对象引用(上转型对象)        pizzamaker01.orderpizza("红披萨");                  //通过抽象客户的对象引用,调用具体客户中继承自抽象客户类中的方法(或是重写的方法)。        System.out.println();        pizzamaker01.orderpizza("黑披萨");    }}

这里写图片描述

0 0
原创粉丝点击