虫虫的技术博客 技术 生活

Thursday, May 9, 2019

设计模式-工厂模式

    工厂模式,也叫工厂方法模式,定义一个用于创建对象的接口,可以控制对哪个类进行实例化



public interface Animal {
    void say();
}



public class Cat implements Animal {
    @Override
    public void say() {
        System.out.println("miao miao miao");
    }
}




public class Dog implements Animal {
    @Override
    public void say() {
        System.out.println("wang wang wang");
    }
}




public class Duck implements Animal {
    @Override
    public void say() {
        System.out.println("ga ga ga");
    }
}



public class AnimalFactory {
    /**
     * 此方法为工厂方法模式,
     * 特点为:
     * 创建了一个对象
     * 返回类型为一个接口或者抽象类
     * 有多个类实现了上述抽象类型
     * @param color
     * @return
     */
    public Animal getAnimal(String color) {
        if ("dog".equals(color)) {
            return new Dog();
        } else if ("cat".equals(color)) {
            return new Cat();
        } else if ("duck".equals(color)) {
            return new Duck();
        } else {
            return null;
        }
    }
}

Demo入口


public class AnimalFactoryDemo {
    public static void main(String[] args) {
        AnimalFactory af = new AnimalFactory();
        Animal cat = af.getAnimal("cat");
        cat.say();
        Animal dog = af.getAnimal("dog");
        dog.say();
        Animal duck = af.getAnimal("duck");
        duck.say();
    }
}



工厂模式的使用场景
需要大量创建对象的工作,不同条件下要创建不同的对象,这些对象都是一个抽象类型的实现类对象

JDK中工厂模式的身影:
《设计模式Java手册》一书中提到,Iterable的子类型的iterator方法是典型的工厂方法模式的应用。我的理解,这里更应该是一个抽象工厂,当然,针对某一个具体的类,比如ArrayList,来说,它的iterator()方法,就是一个工厂方法。


    /**
     * JDK中工厂方法模式,iterator方法
     * 来自《设计模式Java手册》
     * @param args
     */
    public static void main2(String[] args) {
        List list = Arrays.asList(new String[]{"funasdf", "rocsdfd", "sparkkkasf"});
        Iterator i = list.iterator();
        while (i.hasNext()) {
            System.out.println(i.next());
        }

    }

觉得这里的理解还是有些欠缺,等有新的收获再来回顾。

0 comments:

Post a Comment

Popular Posts

Copyright © 虫虫的成长历程 | Powered by Blogger Design by PWT | Blogger Theme by NewBloggerThemes.com