美文网首页
Java设计模式之工厂模式

Java设计模式之工厂模式

作者: PeterHe888 | 来源:发表于2017-09-11 19:58 被阅读67次

    什么是工厂模式

    工厂模式(FactoryPattern),在面向对象程序设计中,工厂通常是用来创建其他对象的对象。
    在工厂模式中,创建对象时,不会对客户端暴露创建逻辑,是通过一个共同的接口来指向新创建的对象。
    工厂模式分为:

    • 普通工厂模式
    • 多个工厂方法模式
    • 静态工厂方法模式

    普通工厂模式

    为了方便理解,我们以人为例子,有一个工厂可以创建人。先创建一个男人,他每天都会"吃饭,睡觉,打豆豆",再创建一个女人,她也会"吃饭,睡觉,打豆豆"。

    Interface : void eat();  void sleep(); void beat();
    
    Class Male: void eat(); void sleep(); void beat();
    
    Class Female: void eat(); void sleep(); void beat();
    
    Class HumanFactory: createHuman(String ) : Human
    

    示例代码

    public interface Human {
        public void eat();
        
        public void sleep();
        
        public void beat();
    
    }
    
    public class Male implements Human{
    
        @Override
        public void eat() {
            System.out.println("Male can eat.");
        }
    
        @Override
        public void sleep() {
            System.out.println("Male can sleep.");
        }
    
        @Override
        public void beat() {
            System.out.println("Male can beat.");
        }
    
    }
    
    public class Female implements Human{
    
        @Override
        public void eat() {
            System.out.println("Female can eat.");
    
        }
    
        @Override
        public void sleep() {
            System.out.println("Female can sleep.");
    
        }
    
        @Override
        public void beat() {
            System.out.println("Female can beat.");
    
        }
    
    }
    
    public class HumanFactory {
        // 普通工厂模式
        public Human createHuman(String gender) {
            if (gender.equals("male")) {
                return new Male();
            } else if (gender.equals("female")) {
                return new Female();
            } else {
                System.out.println("请输入正确的类型");
                return null;
            }
        }
    }
    
    public class FactoryTest {
        public static void main(String[] agrs) {
            HumanFactory factory = new HumanFactory();
            Human male = factory.createHuman("male");
            male.eat();
            male.sleep();
            male.beat();    
        }
    }
    

    运行结果:

    普通工厂模式.png

    多个方法工厂模式

    在上面的普通工厂模式中,我们看到,如果创建人时,传递的字符串出错,则不能正确创建对象,所以就有了多个方法工厂模式,提供多个工厂方法,分别创建对象。
    示例代码

    public class HumanFactory {
        
        //多个工厂方法模式
        public Male createMale() {
            return new Male();
        }
        public Female createFemale() {
            return new Female();
        }   
    }
    
    public class FactoryTest {
        public static void main(String[] agrs) {
            HumanFactory factory = new HumanFactory();
            Male male = factory.createMale();
            male.eat();
            male.sleep();
            male.beat();
        }
    }
    

    运行结果:

    多个方法工厂模式.png

    静态工厂方法模式

    如果将上面多个方法工厂的模式里的方法改为静态方法,则不需要创建实例,直接调用即可。
    示例代码

    public class HumanFactory {
        // 静态工厂方法模式
        public static Male createMale() {
            return new Male();
        }
        public static Female createFemale() {
            return new Female();
        }   
    }
    
    public class FactoryTest {
        public static void main(String[] agrs) {
            Human female = HumanFactory.createFemale();
            female.eat();
            female.sleep();
            female.beat();
        }
    }
    

    运行结果:

    静态工厂方法模式.png
    总结

    那么我们在什么时候需要使用工厂模式呢?
    当需要创建多个产品时,且具有共同的接口时。通过上面的对比,静态工厂方法模式使用起来比较方便,高效。所以我们经常会使用它。

    工厂模式的实际应用

    Calender对象

    java.util.Calender - getINstance()
    java.util.Calendar - getInstance(TimeZone zone)
    java.util.Calendar - getInstance(Locale aLocale)
    java.util.Calendar - getInstance(TimeZone zone, Locale aLocale)
    java.text.NumberFormat - getInstance()
    java.text.NumberFormat - getInstance(Locale inLocale)
    

    Android的程序员,应该会比较熟悉BitmapFactory,也是工厂模式一种应用。

    好了,工厂模式的介绍到此告一段落了~

    相关文章

      网友评论

          本文标题:Java设计模式之工厂模式

          本文链接:https://www.haomeiwen.com/subject/cmifsxtx.html