简单工厂模式

简介: 简单工厂模式是客户端只负责发送参数,由工厂对象去决定创建哪种产品。 优缺点 优点简单工厂模式的核心是工厂类,其中包含了必要的判断逻辑,由此决定应该去创建哪个对象。 而客户端不需要去了解如何创建产品,完全和产品逻辑解耦,它只负责发送指令去“消费”就好了。

简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例。
简单工厂模式又称为静态工厂方法模式(Static Factory Method Pattern),因为其主要逻辑方法多用static关键字修饰。
这种模式下,客户端只负责发送参数,由工厂对象去决定创建哪种产品。

优缺点

  • 优点

简单工厂模式的核心是工厂类,其中包含了必要的判断逻辑,由此决定应该去创建哪个对象。

而客户端不需要去了解如何创建产品,完全和产品逻辑解耦,它只负责发送指令去“消费”就好了。

  • 缺点

创建所有产品的逻辑都放在工厂类中,工厂需要知道每一种产品的创建过程,逻辑过于集中。

添加新的产品生产逻辑时,势必会违反开闭原则,因为要修改工厂类。

Java中的简单工厂

DateFormat类中有以下静态方法:

public final static DateFormat getDateInstance()
public final static DateFormat getDateInstance(int style)
public final static DateFormat getDateInstance(int style, Locale aLocale)

这些方法根据传入参数去构造一个DateFormat的子类对象并返回,而客户端只需要传递参数即可,不去关心具体的子类类型。
如果没有这些简单工厂方法,客户端则需要去了解DateFormat的子类,自己去指定去new哪个子类的对象。

Spring

spring中BeanFactory有如下方法:

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

这就是简单工厂的使用例子,而工厂接收的参数可以通过读取如下配置方式传入:

<bean id="helloWorld" 
 class="com.test.spring.beans.HelloWorld"></bean>

实例

需求: 创建一个生产蒙牛,伊利,特仑苏牛奶的简单工厂。

  • 牛奶抽象接口
package com.faith.net;

/**
 * 牛奶抽象接口
 */
public interface Milk {

    /**
     * 获取一个标准产品
     * @return
     */
    public String getName();

}
  • 特仑苏牛奶
package com.faith.net;

/**
 * 特仑苏
 */
public class Telunsu implements Milk {
    @Override
    public String getName() {
        return "特仑苏";
    }
}
  • 伊利牛奶
package com.faith.net;

/**
 * 伊利
 */
public class Yili implements  Milk {
    @Override
    public String getName() {
        return "伊利";
    }
}
  • 简单工厂
package com.faith.net.simple;

import com.faith.net.Mengniu;
import com.faith.net.Milk;
import com.faith.net.Telunsu;
import com.faith.net.Yili;

/**
 * 简单工厂
 */
public class SimpleFactory {

    public static Milk getMilk(String name){
        if("telunsu".equals(name)){
            return new Telunsu();
        }else if("yili".equals(name)){
            return new Yili();
        }else if("mengniu".equals(name)){
            return new Mengniu();
        }else {
            throw new RuntimeException("wrong request");
        }
    }
}
  • 客户端
package com.faith.net.simple;

/**
 * 客户端
 */
public class SimpleFactoryTest {

    public static void main(String[] args) {
        SimpleFactory.getMilk("telunsu");
    }
}
目录
相关文章
|
19天前
|
设计模式 C# 数据库
简单工厂模式详解
简单工厂模式是一种创建型设计模式,通过工厂类决定实例化哪个具体类,降低客户端与具体类之间的耦合。其特点是封装实例化逻辑,但扩展性较弱,增加新产品需修改工厂类代码。适用于客户端需要创建不同种类的对象但不关心具体实现的场景,如日志处理、图形对象创建和支付系统等。示例代码包括 C++ 和 C# 实现。
32 3
|
19天前
|
设计模式 C# C++
工厂方法模式
工厂方法模式是一种创建型设计模式,定义一个创建对象的接口,但让子类决定具体实例化哪个类。该模式具有高内聚、低耦合的特点,支持动态扩展新产品类型,适用于复杂或经常变化的产品族。其主要组成部分包括抽象产品、具体产品、抽象工厂和具体工厂。工厂方法模式遵循开闭原则,新增产品无需修改现有代码,但会增加系统复杂性。
22 5
|
8月前
|
Java
简单工厂模式
简单工厂模式
42 0
|
设计模式 C++
2023-6-10-第一式工厂方法模式
2023-6-10-第一式工厂方法模式
91 0
|
8月前
|
C#
C#简单工厂模式
C#简单工厂模式
100 0
|
编译器
简单工厂模式~
简单工厂模式~
|
前端开发
简单工厂模式
简单工厂模式
89 0
|
设计模式 监控 uml
剖析工厂方法模式、从开电脑店开始
工厂类负责把实例化类时,复杂的过程透明化,同时避免大量实例化类的重复代码的出现。
剖析工厂方法模式、从开电脑店开始

热门文章

最新文章