为何须要建立型模式以及简单工厂模式(二)

 

建立型模式  

建立型模式不一样于其余模式,由于程序语言自己是支持建立对象实例的 
好比使用new关键字,好比经过反射建立,经过clone()方法建立对象
也能够在构造方法中对建立逻辑进行干预
那么,为何还须要建立型模式?  

建立型概念特色

先看下前文说过的建立型模式概念
建立型模式是用来建立对象的模式,抽象了实例化的过程,封装了建立逻辑
1. 将系统所使用的具体类的信息封装起来
2. 隐藏了类的实例是如何被建立和组织的
 
实例的建立与使用分离
建立型模式的最基本功能就是将对象的建立和使用进行了分离
客户端程序不在关注对象的建立,经过建立型模式进行对象的获取
对象的建立和使用分离就能保证,对象的建立过程所有都被封装在建立型模式之中了
再也不会散乱的存在于使用的类中, 更加便于维护,也符合依赖倒置原则
 
隐藏细节类型
一旦使用建立型模式,就 对客户端程序隐藏了对象建立的细节
甚至能够隐藏对象的具体类型,客户端程序能够仅仅面向抽象编程便可
不须要关注实际使用对象的具体类型, 下降了耦合度
 
逻辑清晰 个性化
构造方法虽然能够封装建立初始化逻辑
可是,构造方法全都是同样的名字,使用建立型模式---好比工厂模式的话,你哪怕什么都不作
只是给多种用途的构造方法设置更加有自解释含义清晰的名字,都会 增长可读性
另外
好比建立型的单例模式,仅仅返回一个对象的实例,若是将这种逻辑植入到构造方法中
将会显得不三不四,由于new关键字构造方法就是单纯的建立对象
不该该将过多的业务逻辑植入其中,它仅适合用于一些初始化操做
使用单独的建立型模式, 逻辑更加清晰
 

场景

当你须要对客户端程序 隐藏实际的对象类型时
当你想要 隐藏实例对象的业务建立逻辑时
当你想要 把对象的使用与建立进行分离时
等等想要 更加个性化定制对象的建立过程的时候
均可以考虑使用建立型模式   
 

简单工厂模式


而工厂模式是简单经常使用的一种建立型模式

概念

工厂模式是最基本的建立型模式,他有三种形式, 简单工厂,工厂方法,抽象工厂
其中最基本的是简单工厂形式, 简单工厂形式简单到不少时候不被称为一种模式,更像是一种经验习惯 
简单工厂模式借助于工厂类的静态方法,根据参数的不一样状况建立不一样的对象
简言之就是:有一个类,他有一个静态方法, 这个静态方法根据条件判断须要建立的对象的类型
 

示例代码

考虑下面的这种场景
有水果类(抽象类、接口)Fruit用于描述水果
另有具体的水果(实现类)苹果Apple 橘子Orange
有一个简单的水果店SimpleFruitFactory 可以销售提供全部的水果
image_5be1399f_7e53
ps:包名不该该有大写,应该尽量地使用一个单词,实在没法避免也不要驼峰命名,所有小写
 
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public interface Fruit {
String description();
}
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public class Apple implements Fruit {
@Override
public String description() {
return "apple";
}
}
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public class Orange implements Fruit {
@Override
public String description() {
return "Orange";
}
}
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public enum FruitType {
APPLE,
ORANGE
}
package simpleFactory;
/**
* Created by noteless on 2018/10/9.
* Description:
*/
public class SimpleFruitFactory {
public static Fruit create(FruitType fruitType){
if(fruitType.equals(FruitType.APPLE)){
return new Apple();
}else if(fruitType.equals(FruitType.ORANGE)){
return new Orange();
}
return null;
}
}
测试代码
image_5be1399f_4868

结构

经过示例能够看得出来,简单工厂模式的确很简单
关键点就是这个静态create方法,内部使用if else结构或者switch结构
因为一般都是静态方法,因此又叫作静态工厂方法模式
模式以下图所示
 
image_5be1399f_34dd
工厂类根据传入的参数决定建立哪种类型的具体产品
工厂类Factory
通常就是具体的Java实现类,在客户端程序的请求下直接建立具体的产品,提供静态工厂方法
抽象产品 Product
工厂所建立对象的父类或者公共接口,通常是接口或者抽象类
具体产品 ConcreteProduct
建立的具体的实例对象
 

特色

简单工厂模式特色:
静态方法根据参数肯定待建立对象的类型
固然,也能够不在一个方法中处理, 也能够建立多个方法来建立不一样的具体产品对象
 
并且,若是产品只有一种的话,也能够省略抽象的产品Product角色
image_5be1399f_54d5
 
简单工厂模式 处于产品实例化的核心位置
他知道每一个产品,也就是内部直接清楚建立的对象类型
他决定哪个产品类应该被实例化
容许客户端程序与具体产品的建立过程独立,在系统引入新产品时,不须要修改客户端代码
因此说站在客户端程序的视角看待的话, 算是符合开闭原则
对于简单的场景,简单工厂模式是一个不错的选择,既可以得到工厂型模式的优势
又足够的简便清晰
 
简单工厂模式根本特色就是一个工厂类包打天下,建立全部的产品
 

简单工厂模式缺点

既然叫作简单工厂模式,他的优势之一天然是简单
全部的建立逻辑都封装在了一个工厂类中,以不变应万变,全部产品的建立都尽在其中
可是 面对复杂的产品体系结构,优势就变成了缺点 ,可能就会过于臃肿复杂不易维护复用
 
好比,若是新增长了子类,怎么办?
显然须要修改工厂的静态方法
想要扩展功能必须修改工厂类的代码,也就是 站在工厂类的角度,不符合开闭原则
并且,面对复杂的产品体系结构,这个工厂类提供全部的建立逻辑
成了一个功能大而全的类,显然这 违背了单一职责原则
也会更容易出现问题
相关文章
相关标签/搜索