zoukankan      html  css  js  c++  java
  • 简单工厂模式(SimpleFactory)

            简单工厂模式是23种模式中最简单的模式,主要用于对象的创建。该模式可以使客户端省去创建不同对象的代码,而把对象的创建交给专门的工厂类。需要注意的是使用这种模式创建的类必须继承自相同的类,否则无法返回创建的对象。工厂类提供一个静态的方法,通过传递不同的参数给这个方法来返回需要的对象。

            下边是简单工厂模式的示例代码,注意这段代码并没有让Fish类和Bird类继承同一个类,而是让他们都实现IAnimal接口,通过这个接口来取得创建的对象。

    Fish类的代码:

    public class Fish implements IAnimal {
        public Fish(){};
        public void eat(){
            System.out.println("Fishes must eat!");
        }
        public void swim(){
            System.out.println("Fish can swim!");
        }
    }

    Bird类的代码:

    public class Bird implements IAnimal {
        public Bird(){}
        public void eat(){
            System.out.println("Birds must eat!");
        }
        public void fly(){
            System.out.println("Birds can fly!");
        }
    }

    IAnimal接口只是一个简单的方法的声明:

    public interface IAnimal {
        public void eat();
    }

    最后给出AnimalFactory类的代码:

    public class AnimalFactory {
        public static IAnimal returnAnimal(String animalName){
            if("fish".equals(animalName)){
                return new Fish();
            }else if("bird".equals(animalName)){
                return new Bird();
            }
            return null;
        }
    }

    下边测试简单工厂模式:

    public class Test {
        public static void main(String[] args) {
            IAnimal fish=AnimalFactory.returnAnimal("fish");
            fish.eat();
            IAnimal bird=AnimalFactory.returnAnimal("bird");
            bird.eat();
        }
    }

    这边程序的输出是:

    Fishes must eat!
    Birds must eat!

    测试成功!

            简单工厂模式使客户端不再负责对象的创建,而把这个工作交给专门的工厂类,这样既明确了分工,也使代码的编写更加的容易。但是简单工厂模式的缺点也是显而易见的,虽然客户端不在负责对象的创建,但是创建对象的代码并没有因此而减少,只是把他们集中在一个类的静态方法里边,当要创建的对象较多时,工厂类的代码会很长,而且都是一些相似的代码,就像上边列出的一样,创建Bird对象和创建Fish对象唯一的不同在于new后边的类名不一样。

            另外,当我们要给不同的类提供不同的初始值的时候,也就是说当类的构造函数需要不同数目或者不同类型的参数时,简单工厂模式就显示的力不从心了。简单工厂模式适用于要创建的对象比较简单的情形。需要注意的是,简单工厂模式使用了面向对象的多态性,这种多态性既可以使用类,也可使接口。

  • 相关阅读:
    HNOI2017影魔
    CQOI2015任务查询系统
    ZJOI2007报表统计
    python学习之 getattr vs __get__ vs __getattr __ vs __getattribute__ vs __getitem__
    jenkins+supervisor实现django项目的自动部署(ubuntu)
    gunicorn+anaconda+nginx部署django项目(ubuntu)
    uwsgi+anaconda+nginx部署django项目(ubuntu下)
    es过滤集提升权重
    一道Python面试题:给出d = [True, False, True, False, True],请利用列表d,只用一句话返回列表[0,2,4]
    从一道Python面试题说起(大神勿入)
  • 原文地址:https://www.cnblogs.com/sunzhenxing19860608/p/1585239.html
Copyright © 2011-2022 走看看