Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 332|回复: 0

[设计模式学习]设计模式:简单工厂

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-4 00:01:11 | 显示全部楼层 |阅读模式
    第一步:
    /*******************新建一个Apple类**********/
    public class Apple {
       // 采集
        public void get() {
          System.out.println("采集苹果"); }}
                                                                                                
    /******************新建一个Banana类**********/
    public class Banana implements Fruit {
        /* 采集 */
        public void get() {
           System.out.println("采集香蕉"); }}

    /***************再新建一个MainClass主类*********/
    public class MainClass {
        public static void main(String[] args) {
          Apple apple = new Apple();
          Banana banana = new Banana();
          apple.get(); banana.get(); }}  
      
      
      
    /*
    * 输出
    * 采集苹果
    * 采集香蕉
    */
    //由此可以看出Apple,Banana这两个类可以抽象出一个方法,他们都是水果,他们都有一个get()这个方法
                            [/code] 第二步:
    //抽取一个接口
    public interface Fruit {
            /**
             * 采集
             */
            public void get();
    }

    //Apple去实现Fruit这个接口
    public class Apple implements Fruit{
            /**
             * 采集
             */
            public void get() {
                    System.out.println("采集苹果");
            }
    }

    //Banana也去实现Fruit这个接口
    public class Banana implements Fruit {
            /**
             * 采集
             */
            public void get() {
                    System.out.println("采集香蕉");
            }
    }

    //这么做的好处是什么呢?我们用了多态,这是我们要去new Apple,Banana的话,我们可以用接口来做
    public class MainClass {
            public static void main(String[] args) {
                    Fruit apple = new Apple();
                    Fruit banana = new Banana();
                    apple.get();
                    banana.get();
            }
    }
    /*
    * 输出
    * 采集苹果
    * 采集香蕉
    */
                            [/code] 回归概念:简单工厂模式
    简单工厂模式属于类的创建模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,
    被创建的实例通常都具有共同的父类.
    第三步:
    //根据以上定义来定义一个工厂
    public class FrutiFactory {
            /**
             * 获得Apple实例
             */
            public static Fruit getApple() {
                    return new Apple();
            }
            /**
             * 获得Banana实例
             */
            public static Fruit getBanana() {
                    return new Banana();
            }
    }

    //这是的MainClass
    public class MainClass {
            public static void main(String[] args) {
                    // 实例化一个Apple
                    Fruit apple = FrutiFactory.getApple();
                    // 实例化一个Banana
                    Fruit banana = FrutiFactory.getBanana();
                    apple.get();
                    banana.get();
            }
    }
    /*
    * 输出
    * 采集苹果
    * 采集香蕉
    */

    //这就是静态工厂的实现
    /**
    * 1,工厂角色(FrutiFactory)
    *   简单工厂模式的核心,它负责实现所有实例的内部逻辑.
    *   工厂类可以被外界直接调用,创建所需的产品对象
    * 2,抽象角色(Fruit)
    *   简单工厂模式所创建的所有对象的父类,他负责描述所有实例所共有的公共接口
    * 3,具体产品角色(apple.get(),banana.get())
    *   简单工厂模式所创建的具体实例的对象
    */
                            [/code]
    第四步:
    //来改进FrutiFactory
    public class FrutiFactory {
            /**
             * get方法,获得所有产品对象
             *
             * @throws IllegalAccessException
             * @throws InstantiationException
             */
            public static Fruit getFruit(String type) throws InstantiationException,
                            IllegalAccessException {
                    if (type.equalsIgnoreCase("apple")) {
                            return Apple.class.newInstance();
                    } else if (type.equalsIgnoreCase("banana")) {
                            return Banana.class.newInstance();
                    } else {
                            System.out.println("找不到相应的实例化类");
                            return null;
                    }
            }
    }
    //MainClass运行
            public static void main(String[] args) throws InstantiationException,
                            IllegalAccessException {
                    Fruit apple = FrutiFactory.getFruit("apple");
                    Fruit banana = FrutiFactory.getFruit("banana");
                    apple.get();
                    banana.get();
            }
                            [/code]
    第五步:
    //继续改进FrutiFactory
    public class FrutiFactory {
            /**
             * get方法,获得所有产品对象
             *
             * @throws ClassNotFoundException
             * @throws IllegalAccessException
             * @throws InstantiationException
             *
             * @throws IllegalAccessException
             * @throws InstantiationException
             */
            public static Fruit getFruit(String type) throws ClassNotFoundException, InstantiationException,
    IllegalAccessException {
                    Class<?> fruit = Class.forName(type);
                    return (Fruit) fruit.newInstance();
            }
    }
    //MainClass运行
    public class MainClass {
            public static void main(String[] args) throws InstantiationException,
                            IllegalAccessException, ClassNotFoundException {
                    Fruit apple = FrutiFactory.getFruit("cobra.simpleFactory.Apple");
                    Fruit banana = FrutiFactory.getFruit("cobra.simpleFactory.Banana");
                    apple.get();
                    banana.get();
            }
    }
                            [/code]
    总结:
    工厂类是整个模式的关键所在,它包含了必要的判断逻辑,能够根据外界给定的信息,决定究竟创建哪个具体类的对象.
    在使用时可以直接根据工厂类去创建所需实例,而无需了解这些对象是如何创建的.有利于整个软件体系的结构优化
    缺点就是:高类聚做的不够好,另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类的修改,扩展性不好.
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 14:28 , Processed in 0.311424 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表