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

    简单工厂(Simple Factory,创建型模式)

    第一步:

    比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用,但是我们发现Apple和Banana都有采集get的方法,所以我们使用Fruit接口进行抽象出来,接口中有一个get方法,然后由Apple类和Banana类去实现,在调用的使用我们就可以使用多态了

    第二步:

    我们发现每次都需要自己去new一个Apple和Banana,感觉不爽,于是我们就去新建一个FruitFactory工厂类进行封装这个new的过程,分别写了两个静态的getAppleInstance()和getBananaInstance()方法,然后在main方法中通过FruitFactory进行调用

    第三步:

    我们发现FruitFactory的两个方法都是获取相应的实例,于是我们就将这两个方法封装为一个方法,getFruitInstance(String className)进行获取相应的实例调用。采用的是if else判断className来获取实例

    第四步:

    我们将getFruitInstance(String className)方法进行改进,使用反射的机制根据传入的类的全名称来获取实例,缺点是调用者必须要知道类的全名称是什么。

    以上四步就是简单工厂的基本使用

    代码实现如下:

    Apple.java

    package com.designpattern.simplefactory;
    
    public class Apple implements Fruit{
        public void get(){
            System.out.println("采集苹果");
        }
    }

    Banana.java

    package com.designpattern.simplefactory;
    
    public class Banana implements Fruit{
        public void get(){
            System.out.println("采集香蕉");
        }
    }

    Fruit.java

    package com.designpattern.simplefactory;
    
    public interface Fruit {
        public void get();
    }

    FruitFactory.java

    package com.designpattern.simplefactory;
    
    public class FruitFactory {
    //    public static Fruit getAppleInstance(){
    //        return new Apple();
    //    }
    //    
    //    public static Fruit getBananaInstance(){
    //        return new Banana();
    //    }
        
        public static Fruit getFruitInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
    //        if(className.equalsIgnoreCase("Apple")){
    //            return new Apple();
    //        }
    //        else if(className.equalsIgnoreCase("Banana")){
    //            return new Banana();
    //        }
    //        else {
    //            System.out.println("没有该类型的实例");
    //            return null;
    //        }
            
            //使用反射机制,必须知道类的全名称
            Class class1 = Class.forName(className);
            return (Fruit)class1.newInstance();
        }
    }

    MainClass.java

    package com.designpattern.simplefactory;
    
    public class MainClass {
    
        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
                /*
                 * 使用了多态,因为这里需要new 一个实例对象,所以使用工厂封装方法
                 */
    //            Fruit apple = new Apple();
    //            apple.get();
    //            Fruit banana = new Banana();
    //            banana.get();
            
            /*
             * 通过工厂调用各自的方法获取实例
             */
    //        Fruit apple = FruitFactory.getAppleInstance();
    //        apple.get();
    //        Fruit banana =FruitFactory.getBananaInstance();
    //        banana.get();
            
            /*
             * 进一步封装实例方法使用
             */
            Fruit apple = FruitFactory.getFruitInstance("com.designpattern.simplefactory.Apple");
            apple.get();
            Fruit banana =FruitFactory.getFruitInstance("com.designpattern.simplefactory.Banana");
            banana.get();
            
        }
    
    }

    一、什么是简单工厂模式

    简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    二、简单工厂模式的优缺点

    在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。

    不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

  • 相关阅读:
    file_zilla 通过key连接远程服务器
    git 恢复丢失的文件
    花括号中的json数据--->转为数组array
    3种日志类型,微信付款反馈-->写入txt日志
    清空数据库中所有表--连表删除
    冒泡排序, 使用最低票价.---双重循环,一重移动次数.二重移动
    navicat 连接远程mysql
    付款前.检查状态.防止重复付款,需要ajax设置为同步,等待ajax返回结果再使用
    反射
    设计模式六大原则
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/3526069.html
Copyright © 2011-2022 走看看