Android设计模式之一个例子让你彻底明白工厂模式(Factory Pattern)

提出疑问

这几天研究工厂模式的时候,看到网上的一些文章中举的例子我就很疑惑,我相信这也是许多人的疑惑:工厂模式的功能就是创建实例,我们创建实例直接new不就完了吗,干嘛还得再封装一层工厂类,然后用工厂类再去new出这个实例?这不多此一举吗?

比如我看到这样的例子,我们的用户分为金牌用户和银牌用户,我们要创建一个金牌用户或者银牌用户。

定义一个用户接口

public interface ICustomer {
     String describe();
}

金牌用户实现类

public class GoldCustomer implements ICustomer{

     @Override
     public String describe() {
            return "金牌用户";
     }

}

银牌用户实现类

public class SilverCustomer implements ICustomer{

     @Override
     public String describe() {
            return "银牌用户";
     }

}

创建用户的工厂类

public class CustomerFactory {
     //创建一个金牌用户
     public static ICustomer createGoldCustomer(){
            return new GoldCustomer();
     }
     //创建一个银牌用户
     public static ICustomer createSilverCustomer(){
            return new SilverCustomer();
     }
}

创建一个金牌用户和银牌用户

public class FactoryPattern {
     public static void main(String[] args) {
            //使用工厂类创建一个金牌用户
           ICustomer goldCustomer = CustomerFactory.createGoldCustomer();
            //使用工厂类创建一个银牌用户
           ICustomer silverCustomer = CustomerFactory.createSilverCustomer();
           System. out.println( goldCustomer.describe());
           System. out.println( silverCustomer.describe());
     }
}

这确实是一个工厂模式,但是我们完全可以不用工厂模式,我们可以直接在main方法里new出来不就得了吗

public class FactoryPattern {
     public static void main(String[] args) {
            //创建一个金牌用户
           GoldCustomer goldCustomer = new GoldCustomer();
            //创建一个银牌用户
           SilverCustomer silverCustomer = new SilverCustomer();
           System. out.println( goldCustomer.describe());
           System. out.println( silverCustomer.describe());
     }
}

结果是一样的

这个例子确实是用的工厂模式,但这并没有体现出工厂模式的优点啊,感觉不用它倒是更方便了!所以有些人看完这个例子后就觉得工厂模式根本没用,以后不用就好了!

一个非常贴近生活的例子来告诉你什么是工厂模式

但是工厂模式真的是个累赘吗?其实并不是!他能够作为一种设计模式流传至今,一定是有他的道理的!只不过我们看到的例子只能说明工厂模式是什么,并不能很好说明工厂模式的优点,所以我们学会后并不知道为什么要使用工厂模式,以及什么时候应该去使用工厂模式!

其实工厂模式在我们的现实生活中非常常见,下面我举个生活中的例子,大家应该就能明白工厂模式的用处在哪里了!

麦当劳大家都吃过吧?我们去点餐的时候,我们可以点一个汉堡,一杯可乐,一个薯条。我们还可以点一杯可乐,一个薯条。点完之后点餐员会问我们一句还要别的吗?你说不要了! 然后你的这一份餐就点完了,可以给钱了。咦,我们发现这是一个建造者模式(Builder Pattern)啊!

(ps:这确实是突然发现的,之前写建造者模式那篇文章的时候并没有想到这个例子)

到现在我们的工厂模式还没有出现,那就先来巩固一下建造者模式吧~反正一会儿和工厂模式也不冲突

假设我们只提供三种类型的食物:汉堡、饮料、小吃

汉堡(巨无霸、吉士汉堡、双层吉士汉堡)

/**
 * 汉堡
 */
public interface IBurgers {
     String makeBurger();
}
public class BigMac implements IBurgers{

     @Override
     public String makeBurger() {
            return "巨无霸";
     }

}
public class CheeseBurger implements IBurgers{

     @Override
     public String makeBurger() {
            return "吉士汉堡包" ;
     }

}
public class DoubleCheeseBurger implements IBurgers{

     @Override
     public String makeBurger() {
            return "双层吉士汉堡" ;
     }

}

饮料(可乐,牛奶,橙汁)

/**
 * 饮料
 */
public interface IBeverages {
     String makeDrinking();
}
public class Coke implements IBeverages{

     @Override
     public String makeDrinking() {
            return "可乐";
     }

}
public class Milk implements IBeverages{

     @Override
     public String makeDrinking() {
            return "牛奶";
     }

}
public class OrangeJuice implements IBeverages{

     @Override
     public String makeDrinking() {
            return "橙汁";
     }

}

小吃(奶昔、巧克力奶昔、苹果派)

/**
 * 小吃
 */
public interface ISnacks {
     String makeSnack();
}
public class MilkShack implements ISnacks{

     @Override
     public String makeSnack() {
            return "奶昔";
     }

}
public class ChocolateShack implements ISnacks{

     @Override
     public String makeSnack() {
            return "巧克力奶昔" ;
     }

}
public class ApplePie implements ISnacks{

     @Override
     public String makeSnack() {
            return "苹果派";
     }

}

好了,食物都准备好了之后,我们还要创建一个订单类,因为这些食物都是客户自选组合的,所以我们的订单类可以使用建造者设计模式

public class Order {
     private IBurgers mBurger;
     private IBeverages mBeverages;
     private ISnacks mSnack;

     private Order(OrderBuilder builder){
            mBurger = builder. mBurger;
            mBeverages = builder. mBeverages;
            mSnack = builder. mSnack;
     }

public String makeOrder(){
           StringBuilder sb = new StringBuilder();
            if ( mBurger!= null) {
                 sb.append( mBurger.makeBurger()).append( " ");
           }
            if ( mBeverages!= null) {
                 sb.append( mBeverages.makeDrinking()).append( " ");
           }
            if ( mSnack!= null) {
                 sb.append( mSnack.makeSnack());
           }
            return sb.toString();
     }

     public static class OrderBuilder{
            private IBurgers mBurger;
            private IBeverages mBeverages;
            private ISnacks mSnack;
            public OrderBuilder(){

           }
            public OrderBuilder addBurger(IBurgers burgers){
                 this. mBurger = burgers;
                 return this;
           }
            public OrderBuilder addBeverage(IBeverages beverages){
                 this. mBeverages = beverages;
                 return this;
           }
            public OrderBuilder addSnack(ISnacks snacks){
                 this. mSnack = snacks;
                 return this;
           }
            public Order build(){
                 return new Order( this);
           }
     }
}

这篇文章并不是讲解建造者模式,如果大家有对建造者模式不懂得可以去看我的另一篇文章Android设计模式之建造者模式(builder pattern)

好了现在我们来了一个顾客,他点了双层吉士汉堡+可乐+巧克力奶昔

public class McDonald {
     public static void main(String[] args) {
           Order order = new Order.OrderBuilder()
                                           .addBurger( new DoubleCheeseBurger())
                                           .addBeverage( new Coke())
                                           .addSnack( new ChocolateShake())
                                           .build();
           System. out.println( order.makeOrder());
     }
}

这时候又进来一个顾客,他只是走路走累了,只想点一杯可乐

public class McDonald {
     public static void main(String[] args) {
           Order order = new Order.OrderBuilder()
                                           .addBeverage( new Coke())
                                           .build();
           System. out.println( order.makeOrder());
     }
}

这时候又进来一个顾客,他也不知道自己到底想吃什么,我们也有过这种情况吧?不知道吃什么怎么办,那就来一个巨无霸套餐把!

工厂模式出现

我们的工厂模式来了!套餐就是人家给你配好的一份订单,你要点巨无霸套餐,人家就直接把巨无霸+可乐+苹果派给你端上来。就不用我们自己去一个一个选了!是不是很方便!现在我们写一个订单工厂类

public class OrderFactory {
     //创建一份巨无霸套餐
     public static Order createBigMacCombo(){
            return new  Order.OrderBuilder()
                                .addBurger( new BigMac())
                                .addBeverage( new Coke())
                                .addSnack( new ApplePie())
                                .build();
     }
}

当我们的顾客来了,说要一份巨无霸套餐,我们只需要这样生成订单

public class McDonald {
     public static void main(String[] args) {
           Order order = OrderFactory. createBigMacCombo();
           System. out.println( order.makeOrder());
     }
}

使用工厂模式,订单生成的操作交给我们订单工厂去做,我们的顾客不用自己去配食物,点餐员只需要一键生成一份巨无霸套餐就可以了!

我们也可以多添加几份套餐供顾客选择

public class OrderFactory {
     //创建一份巨无霸套餐(巨无霸+可乐+苹果派)
     public static Order createBigMacCombo(){
            return new Order.OrderBuilder()
                                .addBurger( new BigMac())
                                .addBeverage( new Coke())
                                .addSnack( new ApplePie())
                                .build();
     }
     //创建一份吉士汉堡套餐(吉士汉堡+牛奶+奶昔)
     public static Order createCheeseBurgerCombo(){
            return new Order.OrderBuilder()
                                .addBurger( new CheeseBurger())
                                .addBeverage( new Milk())
                                .addSnack( new MilkShake())
                                .build();
     }
     //创建一份双层吉士汉堡套餐(双层吉士汉堡+橙汁+巧克力奶昔)
     public static Order createDoubleBurgerCombo(){
            return new Order.OrderBuilder()
                                .addBurger( new DoubleCheeseBurger())
                                .addBeverage( new OrangeJuice())
                                .addSnack( new ChocolateShake())
                                .build();
     }
}

Android源码中工厂模式的体现

我们都是用过线程池对吧,我们创建一个线程池的时候可以这样创建

ExecutorService es = Executors.newCachedThreadPool();

其实这个Executors就是一个工厂类!他的作用就和我们上个例子中的订单工厂OrderFactory一样一样的,我们可以看一看

public class Executors {

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

    public static ExecutorService newWorkStealingPool(int parallelism) {
        return new ForkJoinPool
            (parallelism,
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }

    public static ExecutorService newWorkStealingPool() {
        return new ForkJoinPool
            (Runtime.getRuntime().availableProcessors(),
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }

    public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>(),
                                      threadFactory);
    }

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
 //.....还有很多个
 //这其中每一个方法就是一个套餐!

我们看到其中每一个方法中都是new了一个ThreadPoolExecutor,这才是真正的线程池,它里面有很多个参数我们可以进行配置,但是有时候我们根本不用自己去配置,直接到Executors工厂类中选择一种我们需要的套餐就可以了!省去了复杂的配置过程!这就是Android系统中的工厂模式的体现。和我们的麦当劳是一个意思!

总结

所以工厂模式并不是简简单单的在我们new一个对象外边再包一层工厂类这么简单,他的存在是有他存在的道理的,如果我们只是简简单单new个对象,何必还用工厂模式这么麻烦呢,直接new不就成了吗。通过麦当劳和线程池这个例子,我想大家对于工厂模式的存在意义都心中有数了吧!

时间: 2024-07-31 19:24:51

Android设计模式之一个例子让你彻底明白工厂模式(Factory Pattern)的相关文章

23种设计模式--工厂模式-Factory Pattern

一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例就就依赖与这个类,2者之间的耦合度就高,此时我们就可以使用面向对象的去解决这个问题,将变化点封装起来,这就是我们将要首先引入的简单工厂模式:先来说一个场景,比如我们吃水果这个例子吧,我们有时候想吃苹果,有时候想吃橘子,但是每次都需要去买这些水果,后来有个水果店,又卖橘子,又卖苹果,这个水果店就当于简

【设计模式】工厂模式 Factory Pattern

1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的实例. 角色: 工厂类:接收参数,返回参数指定的类的实例. 抽象产品:返回实例的类型,具体产品的基类. 具体产品:继承自抽象产品的类. 2)工厂方法模式 沿着上面的思路,创建的接口是稳定的,但是创建对象剧烈变化.将稳定的接口抽象成基类,让子类确定实例哪个产品,将实际创建工作推迟到子类中. 工厂方法用

设计模式一 工厂模式Factory

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便

设计模式(一)工厂模式Factory(创建型)(转)

原文链接:http://blog.csdn.net/hguisu/article/details/7505909 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对

研磨设计模式解析及python代码实现——(一)简单工厂模式

最近在学设计模式,正巧书之前学了些python,但用的还不是很成熟.<研磨设计模式>书上只给了java代码,本着以练手为目标,我照着书上打了一遍java代码,在仔细体会其思想后,将其写成了python的代码.有不对的地方希望各位批评指正~ 具体原理不多做介绍,具体可以参考http://chjavach.iteye.com的博客,或者<研磨设计模式>的书. 一.背景介绍 接口思想: 众所周知,面向对象语言最大的特点便是封装,继承,多态这三个概念.而像Java等面向对象语言最核心的思想

设计模式(一)工厂模式Factory(创建类型)

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. 举例来说, 很多类型对象的创造须要一系列的步骤: 你可能须要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你须要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你怎样能轻松方

设计模式-工厂模式[Factory]

先看下一个简单的实现: 1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author [email protected] 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Res

设计模式(一)工厂模式Factory(创建型)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和

iOS设计模式(代码分析系列2:简单工厂模式)

简单工厂模式示例代码下载地址, 1.简述 首先需要说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工作方法模式,是工厂方法模式的特殊实现(也就是说工厂模式包含简单工厂模式).这里对简单工厂模式进行介绍,是为后面的工厂方法和抽象工厂模式做一个引子. 2.定义 "专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类." 世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例. 3.结构图 简要分析结构图: ConcreteProduct