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

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

对工厂模式的个人理解:
(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值