zoukankan      html  css  js  c++  java
  • (@WhiteTaken)设计模式学习——简单工厂模式

    最近工作比较忙,所以没有怎么写博客,这几天将集中学习一下(厉风行)讲解的设计模式的相关知识,并对主要的代码进行介绍。

    言归正传,接下来介绍最简单也是最基础的简单工厂设计模式。

    什么是简单工厂?

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

    假如我们有几种水果,苹果,香蕉,我们希望获得这些水果。

    首先我们声明一个水果接口。

    1 public interface Fruit {
    2     public void Get();
    3 }
    View Code

    然后我们需要让苹果,香蕉的去实现这个接口。

    1 public class Apple implements Fruit{
    2     public void Get()
    3     {
    4         System.out.println("Apple");
    5     }
    6 }
    View Code

    在主类中我们可以通过,直接new一个对象,来创建苹果香蕉,然后调用其Get方法。但是这样做并不是我们想要完成的效果,为了尽可能的降低耦合。

    可以通过创建一个水果的简单工厂,完成水果对象的获取。

    以下的几种方式均可。

     1 import java.lang.invoke.CallSite;
     2 
     3 public class FruitFactory {
     4 //    public static Fruit GetApple(){
     5 //        return new Apple();
     6 //    }
     7 //    
     8 //    public static Fruit GetBanana(){
     9 //        return new Banana();
    10 //    }
    11     
    12 //    public static Fruit GetFruit(String type)
    13 //    {
    14 //        if(type.equals("Apple"))
    15 //        {
    16 //            return new Apple();
    17 //        }else if(type.equals("Banana"))
    18 //        {
    19 //            return new Banana();
    20 //        }
    21 //        return null;        
    22 //    }
    23     
    24 //    public static Fruit GetFruit(String type) throws InstantiationException, IllegalAccessException
    25 //    {
    26 //        if(type.equalsIgnoreCase("apple"))
    27 //        {
    28 //            return (Fruit)Apple.class.newInstance();
    29 //        }else if(type.equalsIgnoreCase("banana"))
    30 //        {
    31 //            return (Fruit)Banana.class.newInstance();
    32 //        }else{
    33 //            System.out.println("找不到对应的水果");
    34 //            return null;
    35 //        }    
    36 //    }
    37     
    38     public static Fruit GetFruit(String type) throws InstantiationException, IllegalAccessException
    39     {
    40         try {
    41             Class fruit=Class.forName(type);
    42             return (Fruit)fruit.newInstance();
    43         } catch (ClassNotFoundException e) {
    44             // TODO Auto-generated catch block
    45             e.printStackTrace();
    46         }
    47         return null;
    48     }
    49 }
    View Code

    这样主方法,也就是我们的客户端,就可以通过直接给出要获得的对象的名称,直接获得想要的对象。

     1 public class MainClass {
     2     public static void main(String[] args) throws InstantiationException, IllegalAccessException {
     3 //        Fruit apple=FruitFactory.GetApple();
     4 //        Fruit banana=FruitFactory.GetBanana();
     5 //        apple.Get();
     6 //        banana.Get();
     7         
     8         Fruit apple=FruitFactory.GetFruit("Apple");
     9         Fruit banana=FruitFactory.GetFruit("Banana");
    10         apple.Get();
    11         banana.Get();
    12     }
    13 }
    View Code

    水果工厂就是一个简单工厂,如果我们这时候要创建葡萄类,只需让其实现Fruit接口即可,这是在客户端就可以通过葡萄对象的名称,获得葡萄对象,而在葡萄类中的相关功能,在主客户端中都不用考虑。

    简单工厂的优点:

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

    缺点:

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

  • 相关阅读:
    maven
    shell脚本--循环结构
    vi编辑器的使用
    数据对象映射模式
    shell脚本--逻辑判断与字符串比较
    shell脚本--分支、条件判断
    shell脚本--数值比较
    shell脚本--文件测试
    sublime text3修改默认配置文件是失败的解决方法
    shell脚本--显示文本内容
  • 原文地址:https://www.cnblogs.com/WhiteTaken/p/6375905.html
Copyright © 2011-2022 走看看