(1.1)工厂模式之简单工厂

转载:https://www.2cto.com/kf/201807/758535.html

工厂模式的核心思想,就是解耦“需求”“工厂”和“产品”。

场景:

GG请自己的女朋友和众多美女吃饭,但是GG自己不会做饭的或者做的饭很不好,这说明GG不用自己去创建各种食物的对象;各个美女都有各自的爱好,到麦当劳后她们喜欢吃什么直接去点就行了,麦当劳就是生产各种食物的工厂,这时候GG不用自己动手,也可以请这么多美女吃饭,所要做的就是买单O(∩_∩)O哈哈~实现:(在后面)

接下来先学习一些知识,对理解面试题有帮助。

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式可以分为三类:

简单工厂模式(Simple Factory)

工厂方法模式(Factory Method)

抽象工厂模式(Abstract Factory)这三种模式从上到下逐步抽象,并且更具一般性。简单工厂模式是工厂模式家族中最简单实用的模式。

简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。它是由一个工厂对象决定创建出哪一种产品类的实例。UML模式类图如下:

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(产品类继承自一个父类或接口)的实例。该模式中包含的角色及其职责工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。抽象产品(Product)角色负责描述所有实例所共有的公共接口(可理解为父类)。具体产品(Concrete Product)角色是简单工厂模式的创建目标,所有创建的对象都是充当该角色的某个具体类的实例。场景实现:

接口类(抽象为食物的共同特征):Food (各类具体食物的父类,方便工厂返回统一的类型;用接口更好,因为类单继承)

实现类(各类食物):Chicken、Chips工厂类(麦当劳):FoodFactory3

抽象食物的共同特征,也就是希望得到什么样的食物,有一个总体的轮廓。

(通过向工厂传入的参数来确定生产什么产品)

抽象食物的共同特征,也就是希望得到什么样的食物,有一个总体的轮廓。
public interface Food {
    //获得相应的食物
    public void get();
}

根据美女的口味去实现想要的食物。
public class Chicken implements Food {
    @Override
    public void get() {
        // TODO Auto-generated method stub
        System.out.println("1.我想要吃童子鸡");
    }
}

创建一个食物工厂类(专门负责生产食物)
//食物工厂
public class FoodFactory {
    public static Food getFood(String type) throws InstantiationException, IllegalAccessException
    {
        if(type.equals("chicken"))
        {
            return Chicken.class.newInstance();
        }
        else if (type.equals("chips")) {
            return Chips.class.newInstance();
        }
        else {
        //这是在判断实例化某一个对象的时候输出的,不是food.get()里面输出的
            System.out.println("怎么这里都没有我想要吃的东西啦!!生气");
            return null;
        }
         
    }
}

测试类
public class FactoryTest {
 
    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        // TODO Auto-generated method stub
        //实例化各类食物
        Food chicken=FoodFactory.getFood("chicken");
        Food chips=FoodFactory.getFood("chips");
        Food icecream=FoodFactory.getFood("icecream");  
        if(chicken !=null)
        {
            chicken.get();  
        }
        if(chips !=null)
        {
            chips.get();
        }
         
        if(icecream !=null)
        {
            icecream.get();
        }
    }
 
}

对简单工厂模式的思考,若再填一个需求,增加一个产品C,则要在工厂条件判断中多加一个条件语句,造成的后果是工厂类会非常的长,拓展和维护都很麻烦,也就是说工厂和产品并没有解耦,绑定在一起。

结论:简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦。

简单工厂模式的优缺点分析:

优点:

  • 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
  • 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。

  缺点:

  • 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
  • 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
  • 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。

 应用场景

在了解了优缺点后,我们知道了简单工厂模式的应用场景:

  • 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;
  • 当工厂类负责创建的对象(具体产品)比较少时。

猜你喜欢

转载自blog.csdn.net/jiangshangchunjiezi/article/details/88603848