菜鸟饼 能不能用java的工厂模式处理下面的问题。 求代码 和 注释

问题描述

菜鸟饼 能不能用java的工厂模式处理下面的问题。 求代码 和 注释
 interface Animal{
    public void say();
}

class Mammal implements Animal{
    public void say(){
        System.out.println("哺乳动物");
    }
}

class  Reptiles implements Animal{
    public void say(){
        System.out.println("爬行动物");
    }
}

class Whale implements Animal{
    private Animal animal;
    public Whale(Animal animal){
        this.animal = animal;
    }
    public void say(){
        System.out.println("鲸喷水");
        animal.say();
    }
}

class Dog implements Animal{
    private Animal animal;
    public Dog(Animal animal){
        this.animal = animal;
    }
    public void say(){
        System.out.println("狗汪汪叫");
        animal.say();
    }
}

class Lizards implements Animal{
    private Animal animal;
    public Lizards(Animal animal){
        this.animal = animal;
    }
    public void say(){
        System.out.println("蜥蜴四角爬行");
        animal.say();
    }
}

class Snake implements Animal{
    private Animal animal;
    public Snake(Animal animal){
        this.animal = animal;
    }
    public void say(){
        System.out.println("蛇有毒");
    }
}

class Gecko implements Animal{
    private Animal lizards;
    public Gecko(Animal lizards){
        this.lizards = lizards;
    }
    public void say(){
        System.out.println("壁虎是蜥蜴的一种,它比较小");
        lizards.say();
    }
}

class MonitorLizard implements Animal{
    private Animal animal;
    public MonitorLizard(Animal animal){
        this.animal = animal;
    }
    public void say(){
        System.out.println("巨蜥是蜥蜴的一种,它比较大");
        animal.say();
    }
}

class Test{
    public static void main(String args []){
        int flag = 4;
        if(flag == 1){
            Mammal mammal = new Mammal();
            Whale whale = new Whale(mammal);
            whale.say();
        }
        else if(flag == 2){
            Reptiles reptiles = new Reptiles();
            Lizards lizards = new Lizards(reptiles);
            lizards.say();
        }
        else if(flag == 3){
            Reptiles reptiles1 = new Reptiles();
            Lizards lizards1 = new Lizards(reptiles1);
            Gecko gecko1 = new Gecko(lizards1);
            gecko1.say();
        }
        else if(flag == 4){
            Reptiles reptiles2 = new Reptiles();
            Lizards lizards2 = new Lizards(reptiles2);
            MonitorLizard ml = new MonitorLizard(lizards2);
            ml.say();
        }
    }
}

解决方案

修改下你的Test类,提取成一个工厂类,面向抽象编程的原则,根据传入的type类型返回具体的某个实现类。
参考代码如下:

class AnimalFactory {
    public static Animal factory(int type) {
        Animal instance = null;
        switch (type) {
        case 1:
            Mammal mammal = new Mammal();
            instance = new Whale(mammal);
            break;
        case 2:
            Reptiles reptiles = new Reptiles();
            instance = new Lizards(reptiles);
            break;
        case 3:
            Reptiles reptiles1 = new Reptiles();
            Lizards lizards1 = new Lizards(reptiles1);
            instance = new Gecko(lizards1);
            break;
        case 4:
            Reptiles reptiles2 = new Reptiles();
            Lizards lizards2 = new Lizards(reptiles2);
            instance = new MonitorLizard(lizards2);
            break;
        default:
            System.out.println("not support this type.");
        }

        return instance;
    }

    public static void main(String[] args) {
        int flag = 4;
        Animal animal = AnimalFactory.factory(flag);
        if (animal != null) {
            animal.say();
        } else {
            System.out.println("this type is not supported.");
        }
    }

}

测试结果跟你的main方法一样,就是将你的main方法中new子类的过程作为工厂方法提出来,根据传入的类型来创建子类,最终返回的类型是抽象类。

解决方案二:

可以是可以,但是没必要。你的main提出出来,把 flag 作为参数,就是“简单工厂模式”。

http://baike.baidu.com/link?url=jB9egByWGlrT_MeCrx-KjOh_EV5SjeJ_8q6f-X-Nc77toPpSWSJ3OJ9wAO8JeyQkze75GDHri_Yhg4hnhLA8KK

解决方案三:

可以用抽象工厂模式!

时间: 2024-09-22 18:20:50

菜鸟饼 能不能用java的工厂模式处理下面的问题。 求代码 和 注释的相关文章

JAVA装饰者模式(从现实生活角度理解代码原理)_java

装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. (2)处理那些可以撤消的职责. (3)当不能采用生成子类的方法进行扩充时.一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长.另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类. 实现该模式的关键步骤: (1)Component(被装饰对象基类

Java简单工厂模式

简单工厂模式 SimpleFactory,适用于业务相对较简单地情况,少扯闲话,先上code: ~~ ICar.java ~~  抽象产品角色接口 /**  * @author VerpHen  * @date 2013年9月10日  上午9:36:19  */ package org.verphen.simpleFactory; /*抽象产品角色接口:汽车Car*/ public interface ICar {  /* 汽车启动 */  public void run();  /* 汽车停止

Java设计模式(三—四)----工厂模式

Java设计模式 工厂模式 一.引言 二.分类 三.简单工厂模式 四.工厂方法模式 五.抽象工厂模式 六.和工厂方法模式区别 七.总结 工厂模式 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象.在这些情况,新对象的建

Java设计模式编程中简单工厂与抽象工厂模式的使用实例_java

简单工厂模式类图 通过一个工厂类,以一个条件来创建对应的对象 //业务功能 public interface ICalculation { double getResult(double numA, double numB); } public class CalcAdd implements ICalculation { @Override public double getResult(double numA, double numB) { System.out.println("加法&qu

怎么简单java工厂模式?谁知道

问题描述 怎么简单java工厂模式?谁知道 怎么建一个简单工厂模式??????怎么建一个简单工厂模式??????怎么建一个简单工厂模式??????怎么建一个简单工厂模式??????怎么建一个简单工厂模式??????怎么建一个简单工厂模式?????? 解决方案 class User { .... } class UserSimpleFactory { public static User GetUser() { return new User(); } } 解决方案二: Java简单工厂模式Jav

java设计模式之简单工厂模式简述_java

简单工厂模式的概念 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例.  简单工厂模式的UML图  简单工厂模式代码学习简单工厂模式的时候我用的是一个与人类有相关的例子.人类在世界分为男人和女人,首先定义一个Human产品的抽象接口  /** * This is factory patter package */ package com.roc.factory; /**

Java设计模式编程中的工厂方法模式和抽象工厂模式_java

工厂方法模式 动机 创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展. 而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定义一个工厂接口,通过实现这个接口来决定实例化那个产品,这就是工厂方法模式,让类的实例化推迟到子类中进行. 目的 1. 定义一个接口,让子类决定实例化哪个产品. 2. 通过通用接口创建对象. 实现 1. 产品接口和具体产品很好理解. 2. 工厂类提供一个工厂方法,返回一个产品对象.但是这个工厂方法是

java设计模式之简单工厂模式_java

在编写一个计算器程序时,可以将业务逻辑和显示分离,业务逻辑封装为一个类(封装):如果要新添加一种运算,可以先创建一个Operation的基类,然后各种运算从Operation类继承,并实现GetResult()虚函数,这时添加新的运算只需要派生一个新的类,即不需要之前的运算参与编译.如何让计算器知道我是希望使用哪种运算呢?应该考虑单独的类来做这个创造实例的过程,这就是工厂.创建一个OperationFactory类,传入参数,函数createOperate就可以实例化出合适的对象. Java代码

java设计模式之简单工厂模式

在编写一个计算器程序时,可以将业务逻辑和显示分离,业务逻辑封装为一个类(封装):如果要新添加一种运算,可以先创建一个Operation的基类,然后各种运算从Operation类继承,并实现GetResult()虚函数,这时添加新的运算只需要派生一个新的类,即不需要之前的运算参与编译.如何让计算器知道我是希望使用哪种运算呢?应该考虑单独的类来做这个创造实例的过程,这就是工厂.创建一个OperationFactory类,传入参数,函数createOperate就可以实例化出合适的对象. Java代码