• 工厂方法模式(Factory Method)


            工厂方法模式是在简单工厂模式的基础上提出来的。在简单工厂模式中由于工厂类只有一个静态方法,当系统中需要创建一个新的类时,为了让这个工厂类继续工作,必须在工厂类的静态方法里边添加新的if语句来适应这个新类。而在工厂方法模式中,不再使用一个单独的工厂类进行对象的创建。

            在工厂方法模式中,工厂类不在是一个单一的类,同时类中也不再只含有一个静态函数。工厂方法模式首先定义一个抽象的工厂类,作为其他工厂类的祖先,下边给出该抽象工厂类的代码示例(在此仍然使用接口来实现,接口也可以实现多态性):

    public interface IFactory{
        public IAnimal createAnimal();
    }

            定义好了具体工厂类的祖先,就可以具体的工厂类了,为了便于表述,先将具体类的祖先(仍然使用接口)和具体类的代码类出来,如下所示:

    祖先类(接口):

    public interface IAnimal{
        public void eat();
    }

    具体类1,Fish.java:

    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!");
        }
    }

    具体类2.Bird.java:

    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!");
        }
    }

            具体的工厂类实现了抽象工厂的接口,当系统中需要添加新的类的时候,只需要添加一个实现抽象接口的新的工厂类即可,这样便于代码的管理,这边给出两个具体的工厂类,这和简单工厂模式中的工厂类没有实质的区别,只不过不需要if进行判断了。代码如下:

    FishFactory.java

    public class FishFactory implements IFactory{
        public IAnimal createAnimal(){
            return new Fish();
        }
    }

    BirdFactory.java

    public class BirdFactory implements IFactory{
        public IAnimal createAnimal(){
            return new Bird();
        }
    }

    请注意上边两个具体工厂类的createAnimal方法的返回值,不是具体的类而是IAnimal,这一点非常重要,通过这个可是实现多态性。最后是测试代码:

    test.java

    public class test {
        public static void main(String[] args){
            Fish f=(Fish)(new FishFactory()).createAnimal();
            Bird b=(Bird)(new BirdFactory()).createAnimal();
            f.eat();
            b.eat();
        }
    }

     

    上边程序的输出是:

    Fishes must eat!

    Birds must eat!

  • 相关阅读:
    Vue3.0官方文档
    简单实现Vue的双向绑定原理
    小程序使用weapp-qrcode二维码插件,宽高自适应解决方法
    小程序判断ios还是android
    手写实现bind
    手写实现call,apply函数
    React onClick点击事件传参三种写法
    zynq 中断
    zynq_ps端点亮led灯代码
    突然发现自己的很多博客无法显示图片,人都傻了,于是就整理了一早上,全部换成了markdown格式,就好了,希望博客的时间不会对大家造成困扰!!!
  • 原文地址:https://www.cnblogs.com/sunzhenxing19860608/p/1587391.html
Copyright © 2020-2023  润新知