设计模式(Java语言)- 简单工厂模式

  简单工厂模式有称为静态工厂模式,属于设计模式中的建立型模式。简单工厂模式经过对外提供一个静态方法来统一为类建立实例。简单工厂模式的目的是实现类与类之间解耦,其次是客户端不须要知道这个对象是如何被穿建立出来的,只须要调用简单工厂模式的方法来统一建立就能够了,从而明确了各个类的职责。java

  1、建立简单工厂模式的步骤

  第一步:声明一个抽象类(接口),以及对应的抽象方法,由实现类分别去实现这个方法。设计模式

  第二步: 建立具体实现类,实现抽象方法。iphone

  第三步:建立一个简单工厂类,声明一个静态方法,根据传入的不一样的类型来肯定建立抽象类的具体实现类。ide

  第四步:客户端经过工厂类获取实例对象。性能

 

  2、应用案例: 

  下面以制造手机为例子,在现实生活中可能有不少工厂能够建立不一样品牌的手机,这些工厂能够根据不一样的需求来建立不一样的手机。根据上面的步骤,首先咱们须要一个抽象类,因此咱们须要知道不一样品牌的手机其实都是属于手机这种类别,所以咱们能够将手机抽出来作成一个抽象类:优化

/**
 * 手机类
 */
public interface Phone {
    //制造手机的方法,留给具体的实现类来制造
    void create();
}

  第二步咱们须要开始制造不一样品牌的手机了:设计

  制造华为手机对象

public class Huawei implements Phone {
    @Override
    public void create() {
        System.out.println("====正在制造华为手机======");
    }
}

  苹果手机blog

public class Iphone implements Phone {
    @Override
    public void create() {
        System.out.println("====正在制造苹果手机======");
    }
}

  第三步咱们须要建立一个工厂方法,返回手机类。具体制造什么品牌的手机,须要根据传进来的手机名字来决定,所以咱们能够这么写:接口

public class SimpleFactory {

    public static Phone createPhone(String name) {
        if ("huawei".equals(name))
            return new Huawei();
        else
            return new Iphone();

    }

}

  第四步,手机建立好了,咱们就可使用了,即客户端调用工厂方法建立对象实例

public class Client {

public static void main(String[] args) {
Phone huawei = SimpleFactory.createPhone("huawei");
huawei.create();

Phone iphone = SimpleFactory.createPhone("iphone");
iphone.create();
}

}

//输出结果

====正在制造华为手机======
====正在制造苹果手机======

  到这里,简单工厂模式基本已经写完了,仔细看会发现这种方法建立对象违反了ocp原则,每次增长不一样品牌手机的时候都须要在工厂方法里添加不一样的条件判断。若是手机品牌愈来愈多,代码看起来很是臃肿,很不利于后期的代码维护。所以,咱们改进一下,不要经过手机品牌名称来判断须要建立哪一中对象了,而是客户端想要建立什么对象,只须要传入具体的实现类就能够了,而后经过Java的反射来建立对象。

public class SimpleFactory2 {

    public static Phone create(Class<? extends Phone> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

}

  客户端调用

public class Client {

    public static void main(String[] args) {
        Phone huawei = SimpleFactory2.create(Huawei.class);
        huawei.create();

        Phone iphone = SimpleFactory2.create(Iphone.class);
        iphone.create();
    }

}
//运行结果

====正在制造华为手机======
====正在制造苹果手机======

  通过修改以后,每次增长新的手机品牌时就不用修改工厂方法的逻辑了。可是,仍是有一个问题,就是每次建立对象都是经过反射来建立的,因此在性能上是有必定的损耗的。

 

  3、总结:

  优势:

    一、简单优化了软件体系结构,明确了各自功能模块的职责和权利

    二、经过工厂类,外界不须要直接建立具体产品对象,只须要负责消费,不须要关心内部如何建立对象

  缺点:

    一、改进前的简单工厂模式所有建立逻辑都集中在一个工厂类中,能建立的类只能是考虑到的,若是须要添加新的类,就必须改变工厂类了

    二、改进前的简单工厂模式随着具体产品的不断增多,可能会出现共产类根据不一样条件建立不一样实例的需求,这种对条件的判断和对具体产品类型的判断交错在一块儿,很难避免功能模块的蔓延,对系统的维护和扩展不利

    三、改进后的简单工厂模式主要是使用反射效率会低一些

相关文章
相关标签/搜索