zoukankan      html  css  js  c++  java
  • 设计模式之简单工厂模式Simple Factory(四创建型)

    1. 工厂模式简介。

      工厂模式专门负责将大量有共同接口的类实例化

      工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。

      工厂模式有三种形态:

      1、简单工厂模式Simple Factory,又称静态工厂方法模式

      2、工厂方法模式Factory Method,又称多态性工厂模式

      3、抽象工厂模式Abstract Factory,又称工具箱模式

    2、什么是简单工厂模式

    简单工厂模式是类的创建模式。是由一个工厂对象决定创建出哪一种产品类的实例,是不同的工厂方法模式的一个特殊实现。由一个工厂对象决定创建出哪一种产品类的实例,负责将大量有共同接口的类实例化。

    3、使用实例

    一个农场公司,专门向市场销售各类水果。系统中需要描述下列水果:

    1苹果Apple

    2葡萄Grape

    3草莓Strawberry

    水果与其他的植物不同,为与农场的其他植物区分开,可建立一个各种水果都适用的水果接口,该接口规定出水果类均需具备的方法:种植plant()、生长grow()以及收获harvest()。

    类图如下:

    具体实现类如下:

    Fruit类:

    /**
    * @FileName Fruit.java
    * @Package com.ali.pattern.factory.simplefactory
    * @Description TODO[what the file to do]
    * @Author ali blog:http://www.cnblogs.com/accipiter
    * @Date 2016年1月19日下午8:15:49
    * @Version V1.0.1
    */
    package com.ali.pattern.factory.simplefactory;
    
    /**
     * @ClassName Fruit
     * @Description 一个各种水果都适用的水果接口,该接口规定出水果类均需具备的方法
     * @Date 下午8:15:49
     */
    public interface Fruit {
        public void plant();
        public void grow();
        public void harverst();
    }

    FruitGardener类:

    /**
    * @FileName FruitGardener.java
    * @Package com.ali.pattern.factory.simplefactory
    * @Description TODO[what the file to do]
    * @Author ali blog:http://www.cnblogs.com/accipiter
    * @Date 2016年1月19日下午8:32:34
    * @Version V1.0.1
    */
    package com.ali.pattern.factory.simplefactory;
    
    import com.ali.pattern.factory.simplefactory.impl.Apple;
    import com.ali.pattern.factory.simplefactory.impl.Grape;
    import com.ali.pattern.factory.simplefactory.impl.Strawberry;
    
    /**
     * @ClassName FruitGardener
     * @Description TODO
     * @Date 下午8:32:34
     */
    public class FruitGardener {
        public static Fruit factory(String which){
            if(which.equals("apple")){
                return new Apple();
            }else if(which.equals("grape")){
                return new Grape();
            }else if(which.equals("strawberry")){
                return new Strawberry();
            }else{
                return null;
            }
        }
    }

    Apple类:

    /**
    * @FileName Apple.java
    * @Package com.ali.pattern.factory.simplefactory.impl
    * @Description TODO[what the file to do]
    * @Author ali blog:http://www.cnblogs.com/accipiter
    * @Date 2016年1月19日下午8:25:14
    * @Version V1.0.1
    */
    package com.ali.pattern.factory.simplefactory.impl;
    
    import com.ali.pattern.factory.simplefactory.Fruit;
    
    /**
     * @ClassName Apple
     * @Description TODO
     * @Date 下午8:25:14
     */
    public class Apple implements Fruit {
    
        @Override
        public void plant() {
            System.out.println("Plant apple.");
        }
    
        @Override
        public void grow() {
            System.out.println("grow apple.");
            
        }
    
        @Override
        public void harverst() {
            System.out.println("harverst apple.");
        }
    
    }

    4、简单工厂模式的特点:

    在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。

    在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配臵文件中,修改参数时无须修改任何Java源代码。

    简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。

    简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

    优点:

    1、模式的核心是工厂类,该类中含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅负责"消费"产品。

    2、简单工厂模式实现了对责任的分割。

    缺点:

    1. 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

    2、使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。

    3、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

    4、简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

    ========博客园管理员似乎不太喜欢设计模式的文章,也许是太多了吧,不过都的学一遍====================================

  • 相关阅读:
    visual basic VB.NET实例系列教程第三节(常用循环结构之乘法表与数列)
    visual basic VB.NET实例系列教程第二节(好玩又有趣的龟兔赛跑程序)
    visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)
    对DevSecOps的一点认识
    轻便的一句话反弹shell语句
    ActiveMQ 反序列化漏洞(CVE-2015-5254)复现
    《信息安全风险管理》梗概
    微信服务商分账功能开发(PHP)
    哈夫曼编码—文件的压缩与解压(Java)
    哈夫曼编码—数据压缩与解压(Java)
  • 原文地址:https://www.cnblogs.com/accipiter/p/5143539.html
Copyright © 2011-2022 走看看