设计模式之简单工厂,工厂方法,抽象工厂模式

目录

1.简单工厂模式

1)最基本的实现

2)通过Map集合实现

3) 通过反射技术实现

2.工厂方法模式

3.抽象工厂模式


 

1.简单工厂模式

1)最基本的实现

        简单工厂常用的方法就是一个工厂类,里面包含很多if else结构 或者switch case 、如下代码ProductA和ProductB是分别的两个不同的类:

public class Factory {
    //可以在工厂类中添加任何你所需要的逻辑
    public static Product create(String str){
        //生成ProductA
        if(str.equalsIgnoreCase("ProductA")){
            return new ProductA();
        }
        else if(str.equalsIgnoreCase("ProductB")){  //生成ProductB
                return new ProductB();
         }
        return null;
    }

}

2)通过Map集合实现

        通过传入不同的参数返回不同的对象。实际在开发中其实也是可以通过Map集合来存储的,把key存为需要查询的内容(这个Map可以提前设置,也可以配置到配置文件里面)

package com.wusu

public class Factory {
    
    private Map<String, Product> map = new HashMap<>();

    public static Product create(String product){
       //通过传入的
        return map.get(product);
    }
}

配置文件:

   <bean id="productA" class="com.wusu.ProductA"> 
        ....   
   </bean>
    <bean id="productB" class="com.wusu.ProductB"> 
        ....   
   </bean>

  <bean id="productFactory" class="com.wusu.Factory">    
        <property name="map">
            <map>
                <entry key="productA" value-ref="productA"></entry>  //这里value-ref是引用的上面设置的bean的id
                <entry key="productB" value-ref="productB"></entry>
            </map>
        </property>
    </bean>
 

3) 通过反射技术实现

public class Factory {
    //可以在工厂类中添加任何你所需要的逻辑
    public static Product create(String str){
         //LoadClassUtils 这个可以是 一个工具类,根据(比如productA)反射技术实例化一个对象
        return  LoadClassUtils.Load(str).newInstance();  
    }

}

2.工厂方法模式

       简单工厂模式只是在一个工厂类中做逻辑判断,如果需要添加新的类,需要修改代码,但是上面使用Map来储存并放到配置文件中也可以实现不修改代码。工厂方法模式就是对于做逻辑判断的条件放到客户端代码实现。

   优点:相比简单工厂在代码做判断,实现类“开放-封闭”原则,

  缺点:每新加一个类,都需要再次添加一个工厂的实现类。如果要添加大量的类,出现大量工厂类。

具体实现可以参考别人优秀的博客:https://www.cnblogs.com/zhi-hao/p/4028169.html


3.抽象工厂模式

   和工厂方法模式对比,简单来看 就是工厂的接口中多定义了不止一个方法,(工厂方法模式的接口是只有一个方法)。他是在处理一个工厂可以生产出这个产品所有附带的集合。可以通过别人的https://www.cnblogs.com/zhi-hao/p/4028169.html 文档作对比

猜你喜欢

转载自blog.csdn.net/weixin_40792878/article/details/83036033