设计模式-工厂模式

工厂模式

git demo地址:https://github.com/Gdk666/Design-Pattern-Demo/tree/master/src/Factory

属于创建型设计模式,需要生成的对象叫做产品,生成对象的地方叫做工厂

使用场景:

 

在任何需要生成复杂对象的地方,都可以使用工厂方法模式。 

直接用new可以完成的不需要用工厂模式。

一丶简单(静态)工厂模式

产品的抽象类

public abstract class INoodles { 

/*

*

* 描述每种面条啥样的

*/ 

public abstract void desc();

}

具体产品类

public class LzNoodles extends INoodles { 

    @Override public void desc() {

            System.out.println("兰州拉面 上海的好贵 家里才5 6块钱一碗");

    }

}

public class PaoNoodles extends INoodles {

        @Override public void desc() {

        System.out.println("泡面好吃 可不要贪杯");

    }

}

工厂类

public class SimpleNoodlesFactory { 

    public static final int TYPE_LZ = 1;//兰州拉面 

    public static final int TYPE_PM = 2;//泡面 

        public static INoodles createNoodles(int type) { 

        switch (type) { 

        case TYPE_LZ: return new LzNoodles(); 

        case TYPE_PM: return new PaoNoodles(); 

     }

    }

}

mian

/** * 简单工厂模式 */   

 INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_LZ);

    noodles.desc();

特点

1 它是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。

2 create()方法通常是静态的,所以也称之为静态工厂

缺点

1 扩展性差(我想增加一种面条,除了新增一个面条产品类,还需要修改工厂类方法)

2 不同的产品需要不同额外参数的时候 不支持。

二丶多方法工厂

多方法的工厂模式为不同产品,提供不同的生产方法,使用时 需要哪种产品就调用该种产品的方法,使用方便、容错率高,多增加一个产品只要在工厂内静态方法。

例如:线程池 Executor类

public class MulWayNoodlesFactory { 

    /**

     * 模仿Executors 类

     * 生产泡面

     *

     * @return

     */ 

    public static INoodles createPm() { 

        return new PaoNoodles();

    } 

    /**

     * 模仿Executors 类

     * 生产兰州拉面

     *

     * @return

     */ 

    public static INoodles createLz() { 

        return new LzNoodles();

    } 

}

main

INoodles lz2 = MulWayNoodlesFactory.createLz();

    lz2.desc();

三丶枚举非静态方法实现工厂方法模式

/**

* @ClassName Guoz

* @Data 9:57

* @Version 1.0

**/

public enum SimpleFactory {

    pig{

            public Animal create(){

                return new PigAnimal();

    }

},

Dog{

            public Animal create(){

                return new DogAnimal();

    }

};

public abstract Animal create();

}
main
/**

* @ClassName Guoz

* @Data 10:05

* @Version 1.0

* 枚举非静态方法实现工厂方法模式

**/

public class mian {

public static void main(String[] args) {

            Animal animal = SimpleFactory.pig.create();

                animal.Kind();

    }

}

优点:

  • 避免错误调用的发生

  • 性能好,使用便捷,枚举类型的计算是以int类型的计算为基础。

  • 降低耦合度

源码撑腰环节

查看java源码:java.util.concurrent.Executors类便是一个生成Executor 的工厂 ,其采用的便是 多方法静态工厂模式

例如ThreadPoolExecutor类构造方法有5个参数,其中三个参数写法固定,前两个参数可配置,如下写。

public static ExecutorService newFixedThreadPool(int nThreads) {

return new ThreadPoolExecutor(nThreads, nThreads,

0L, TimeUnit.MILLISECONDS,

new LinkedBlockingQueue<Runnable>());

}

又如JDK想增加创建ForkJoinPool类的方法了,只想配置parallelism参数,便在类里增加一个如下的方法:

public static ExecutorService newWorkStealingPool(int parallelism) {

return new ForkJoinPool

(parallelism,

ForkJoinPool.defaultForkJoinWorkerThreadFactory,

null, true);

}

这个例子可以感受到工厂方法的魅力了吧:方便创建 同种类型的 复杂参数 对象

具体使用的方法也可以看看:设计模式-策略模式与工厂模式的在项目中的结合使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值