zoukankan      html  css  js  c++  java
  • 设计模式-简单工厂模式(SimpleFactory)

    简单工厂模式又叫静态工厂模式,,通过定义一个类(FruitFactory)来负责创建其他类的实例,被创建的实例通常都具有相同的父类(Fruit)。

    角色和职责

    1.工厂角色(Factory)-FruitFactory:

        简单工厂模式的核心。它负责创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品对象。

    2.抽象产品(Product)-Fruit:

        简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

    3.具体产品(concrete product)-Banana、Apple:

        简单工厂模式所创建的具体实例对象

    UML图:

    具体代码:

    /**
     * 水果接口类
     */
    public interface Fruit {
        public void pick();
    }
    /**
     * 苹果实现类
     */
    public class Apple implements Fruit{
    
        @Override
        public void pick() {
            System.out.println("采摘苹果");
        }
    }
    /**
     * 香蕉实现类
     */
    public class Banana implements Fruit{
        @Override
        public void pick() {
            System.out.println("采摘香蕉");
        }
    }
    /**
     * 水果生产类
     */
    public class FruitFactory {
    
        public static Fruit getFruit(String fruitName) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            //原简单工厂模式写法
    //        if(fruitName.equalsIgnoreCase("apple")){
    //            return new Apple();
    //        }else if(fruitName.equalsIgnoreCase("banana")){
    //            return new Banana();
    //        }
    //        return null;
            //简单工厂模式优化后的代码如下:
           Class cls =  Class.forName(fruitName);
           return (Fruit) cls.newInstance();
        }
    }
    public class Main {
        public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
            Fruit apple = FruitFactory.getFruit("Apple");//生产苹果
            Fruit banana = FruitFactory.getFruit("Banana");//生产香蕉
            apple.pick();
            banana.pick();
        }
    }

    结果:

    采摘苹果
    采摘香蕉

    优缺点:

    优:在这个模式下,工厂类(FruitFactory)是整个模式的核心,根据外界给定的信息,决定用哪个具体类对象。

    缺:高内聚,扩展性差,多一个水果时,需要去创建。

    项目源码:https://github.com/qjm201000/design_pattern_simpleFactory.git

  • 相关阅读:
    MySQL InnoDB 存储引擎探秘
    MySQL优化面试
    技术面试老是有劲使不出,该怎么办?
    详解RPC远程调用和消息队列MQ的区别
    ConcurrentHashMap1.8源码分析
    kafka topic制定规则
    GitLab本地、远程更新已经fork的项目
    Swagger2使用参考
    分布式配置中心选型
    搭建Elasticsearch平台
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10044578.html
Copyright © 2011-2022 走看看