`

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

阅读更多
  1. 工厂模式专门负责将大量有共同接口的类的实例化。工厂模式可以动态决定将哪个类实例化,不必事先知道每次需要实例化哪个类。

工厂模式主要有以下几种形态:

  • 简单工厂模式(Simple Factory):又称静态工厂方法(Static Factory Method)模式。
  • 工厂模式(Factory Method):又称多态性工厂(Ploymorphic Factory)模式或虚拟构造函数(Virtual Constructor)模式。
  • 抽象工厂(Abstract Factory)模式:又称工具箱(Toolkit)模式。

本文将简单工厂模式。

一:引入

public class Client...{
       
public Fruit getEatFruit(String type)
       
...{
           Fruit fruit
=null;

           
if (type.equals("apple"))
           
...{
               fruit
=new Apple();
           }

           
else if (type.equals("banana"))
           
...{
               fruit
=new Banana();
           }

           
else if (type.equals("grape"))
           
...{
               fruit
=new Grape();
           }


           fruit.pick();
           fruit.peel();
           
           
return fruit;
           
       }

      
}

/**//*此段代码的问题:
1:如果有新的水果类型需要加入的化必须修改创建Fruit那段代码,在整个以上代码中这段创建Fruit代码那段是可能会变的,根据encapsulate what varies原则,OCP.原则,这段代码需要提出来。
2:创建Fruit这段代码可能在其他地方也会用到(Client2,Client3...),所以这种公共的代码需要单独提出来,而不是分散到各个客户类中。
*/

//修改如下
public class FruitFactory ...{
       
public static  Fruit createFruit(String type)
       
...{
           Fruit fruit
=null;
           
if (type.equals("apple"))
           
...{
               fruit
=new Apple();
           }

           
else if (type.equals("banana"))
           
...{
               fruit
=new Banana();
           }

           
else if (type.equals("grape"))
           
...{
               fruit
=new Grape();
           }

                            
//增加一种product,只要修改此一处即可,客户代码不用修改
                            else if (type.equals("orange"))
           
...{
               fruit
=new Orange();
           }

       

       
           
return fruit;           
       }

}



public class Client...{
/**//*       public Fruit getEatFruit(String type)
       {
           Fruit fruit=null;
           if (type.equals("apple"))
           {
               fruit=new Apple();
           }
           else if (type.equals("banana"))
           {
               fruit=new Banana();
           }
           else if (type.equals("grape"))
           {
               fruit=new Grape();
           }
           fruit.pick();
           fruit.peel();
           
           return fruit;
           
       }
*/

       
       
public Fruit getEatFruit(String type)
       
...{
           Fruit fruit
=FruitFactory.createFruit(type);
           fruit.pick();
           fruit.peel();
           
           
return fruit;
           
       }

      
}



 

二:结构

工厂类角色Creator (FruitFactory):工厂类在客户端的直接调用下创建产品对象。

抽象产品角色Abstract Product (Fruit):定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。

具体产品角色ConcreteProduct (Apple, Banana):定义工厂具体加工出的对象。

简单抽象模式的其他形态

  • 在有些情况下Simple Factory可以由抽象产品角色扮演,一个抽象产品类同时是子类的工厂
  • 三个角色全部合并:

三:实际应用 

  1. java.text.DateFormat:用此类或其子类格式化日期或时间。

           

public abstract class DateFormat extends Format ...{
    
public final static DateFormat getDateInstance()
    
...{
        
return get(0, DEFAULT, 2, Locale.getDefault());
    }

    
    
private static DateFormat get(int timeStyle, int dateStyle,
                                  
int flags, Locale loc) ...{
        
if ((flags & 1!= 0...{
            
if (timeStyle < 0 || timeStyle > 3...{
                
throw new IllegalArgumentException("Illegal time style " + timeStyle);
            }

        }
 else ...{
            timeStyle 
= -1;
        }

        
if ((flags & 2!= 0...{
            
if (dateStyle < 0 || dateStyle > 3...{
                
throw new IllegalArgumentException("Illegal date style " + dateStyle);
            }

        }
 else ...{
            dateStyle 
= -1;
        }

        
try ...{
            
return new SimpleDateFormat(timeStyle, dateStyle, loc);

        }
 catch (MissingResourceException e) ...{
            
return new SimpleDateFormat("M/d/yy h:mm a");
        }

    }

  

}

/**//*
说明:getDateInstance()返回一个DateFormat 实例,实际上最终是new SimpleDateFormat(timeStyle, dateStyle, loc);

SimpleDateFormat是DateFormat的子类。
这样加入新的子类eg:OtherDateFormat时对客户代码没有影响。
Factory角色:DateFormat
Abstract Product角色:DateFormat
Concrete Product角色:SimpleDateFormat

*/

 

四:优缺点

  • 优点:
    工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
  • 缺点:
分享到:
评论

相关推荐

    JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)

    **简单工厂模式**是软件设计模式中的一种,属于创建型模式。在Java编程中,它是一种用于创建对象的简便方法,将对象的实例化过程封装到一个单独的工厂类中,使得客户端代码无需直接调用具体类的构造函数,而是通过...

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

    Simple Factory模式: 定义创建对象的接口,并封装对象的创建。 一般情况下,我们为了提高内聚和松耦合,经常会使用多态来处理一些问题。抽象出一些类的公共接口作为抽象基类或者接口。这样的话,我们将会面临一个...

    创建型模式-简单工厂(非23种之内)

    在某些情况下,可以考虑使用其他创建型模式,如工厂方法模式、抽象工厂模式或构建者模式,以适应更复杂的需求。例如,工厂方法模式允许子类决定具体的产品实例,而抽象工厂模式则处理一组相关的或相互依赖的对象的...

    设计模式----简单工厂模式

    简单工厂模式是软件设计模式中的一种基础模式,它属于创建型模式,主要解决对象的创建问题,使得代码在创建对象时更加灵活,同时也隐藏了对象的创建细节。在这个模式中,一个专门的工厂类负责创建特定类型的对象,而...

    北风网-设计模式-简单工厂模式ppt

    简单工厂模式是面向对象设计模式中的一种,它属于创建型模式,主要解决的是在系统中如何创建对象的问题。设计模式是软件开发中的经验总结,旨在提高代码的可重用性、可读性和可维护性。 在简单工厂模式中,一个工厂...

    calculator-of-Simple-Factory-Pattern.rar_factory

    简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这种类型的设计模式属于简单工厂模式,也被称为静态工厂方法模式。在这个例子中,我们有一个计算器程序,它是通过...

    simple-factory-demo.zip

    简单工厂模式是一种设计模式,它是创建型模式的一种,主要用于简化对象的创建过程。在这个`simple-factory-demo.zip`压缩包中,我们很可能会找到一个示例程序,它演示了如何在实际代码中应用简单工厂模式。 简单...

    Simple-Factory-for-Salary.rar_factory

    【描述】"Simple Factory Design-Pattern for Calculate Salary for VC6 project" 描述了项目的核心设计思想——简单工厂模式。这是一种创建型设计模式,它提供一个创建对象的接口,但允许子类决定实例化哪一个类。...

    java 设计模式 Facade外观模式 Simple Factory 简单工厂模式

    在Java中,简单工厂模式适用于对象的创建过程较为固定或不复杂的情况。它定义一个公共的工厂类,根据传入的参数或者条件来决定返回哪个具体类的实例。这种方式降低了代码的耦合度,使得在不修改客户端代码的情况下,...

    设计模式----工厂模式

    1. **简单工厂模式**(Simple Factory Pattern):由一个静态方法或单例类负责创建对象,适用于对象种类较少且不会频繁变动的情况。 2. **工厂方法模式**(Factory Method Pattern):定义一个创建对象的接口,让...

    工厂模式(简单工厂,普通工厂,抽象工厂)代码java

    在软件设计模式中,工厂模式是一种非常常用的行为型模式,它的主要目的是为了隔离对象的创建过程,使得客户端代码不直接创建对象,而是通过一个工厂类来负责对象的创建。这样可以使得系统更具可扩展性和可维护性。...

    软件编程模式---工厂模式基础

    工厂模式是设计模式中的一种,属于创建型模式,它的主要目的是为了封装对象的创建过程,提供一个统一的接口来生成不同类型的实例,而无需暴露具体的创建逻辑。这篇教程将深入探讨工厂模式的基础知识,帮助你理解和...

    Simple Factory Pattern.rar【GoF的简单工厂模式(C#源码)】

    简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常它根据自变量的不同返回不同的类的实例。 简单工厂模式的实质是由一个工厂类根据传入的参量,动态决定...

    java工厂模式SimpleFactory

    总的来说,Java工厂模式SimpleFactory是一种实用的设计模式,能够帮助我们更好地管理对象的创建过程,提高代码的可维护性和可扩展性。通过将对象的创建过程封装在工厂类中,我们可以在不修改客户端代码的情况下,...

    工厂模式FactoryMode

    工厂模式是一种常用的面向对象设计模式,它属于创建型设计模式,旨在提供一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时,它不会直接创建,而是调用一个专门的工厂对象来完成这个任务。这样...

    java设计模式-简单工厂模式示例

    简单工厂模式是面向对象设计中的一种经典设计模式,它属于创建型模式,主要用来解决对象的创建问题。在Java编程中,简单工厂模式通过一个中心工厂类来负责创建相关的对象,而无需让客户端代码直接new具体的产品类。...

Global site tag (gtag.js) - Google Analytics