设计模式之-简单工厂模式
2019-07-22 本文已影响0人
MengkZhang
1. 含义
- 简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法)
- 现实生活中,工厂是负责生产产品的;同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”
2. 解决的问题
将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦
3. 模式原理
3.1 模式组成
![](https://img.haomeiwen.com/i5914881/5b97102ae672eda6.png)
3.2 UML类图
![](https://img.haomeiwen.com/i5914881/eeec93c15bcbb0c3.png)
3.3 使用步骤
- 创建抽象产品类 & 定义具体产品的公共接口;
- 创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
- 创建工厂类,通过创建静态方法根据传入不同参数从而创建不同具体产品类的实例;
- 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
4. 实例
- 背景:小A有一个塑料生产厂,用来做塑料加工生意
- 目的:最近推出了3个产品,小成希望使用简单工厂模式实现3款产品的生产
使用步骤
步骤1. 创建抽象产品类,定义具体产品的公共接口
/**
* Created by zhang on 2019/7/22 0022.
* Desc:
*/
public abstract class Product {
public abstract void show();
}
步骤2. 创建具体产品类(继承抽象产品类),定义生产的具体产品
/**
* Created by zhang on 2019/7/22 0022.
* Desc: 具体产品类A
*/
public class ProductA extends Product {
@Override
public void show() {
Log.e("===z","生产了产品A");
}
}
/**
* Created by zhang on 2019/7/22 0022.
* Desc: 具体产品类B
*/
public class ProductB extends Product {
@Override
public void show() {
Log.e("===z","生产了产品B");
}
}
/**
* Created by zhang on 2019/7/22 0022.
* Desc: 具体产品类C
*/
public class ProductC extends Product {
@Override
public void show() {
Log.e("===z","生产了产品C");
}
}
步骤3. 创建工厂类,通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例
/**
* Created by zhang on 2019/7/22 0022.
* Desc:
*/
public class Factory {
public static Product manufacture(String productName) {
//工厂类里用switch语句控制生产哪种商品;
//使用者只需要调用工厂类的静态方法就可以实现产品类的实例化。
switch (productName) {
case "A":
return new ProductA();
case "B":
return new ProductB();
case "C":
return new ProductC();
default:
return null;
}
}
}
步骤4. 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Factory factory = new Factory();
//客户要产品A
try {
//调用工厂类的静态方法 & 传入不同参数从而创建产品实例
factory.manufacture("A").show();
}catch (NullPointerException e){
Log.e("===z","没有这一类产品");
}
//客户要产品B
try {
//调用工厂类的静态方法 & 传入不同参数从而创建产品实例
factory.manufacture("B").show();
}catch (NullPointerException e){
Log.e("===z","没有这一类产品");
}
//客户要产品C
try {
//调用工厂类的静态方法 & 传入不同参数从而创建产品实例
factory.manufacture("C").show();
}catch (NullPointerException e){
Log.e("===z","没有这一类产品");
}
//客户要产品D
try {
//调用工厂类的静态方法 & 传入不同参数从而创建产品实例
factory.manufacture("D").show();
}catch (NullPointerException e){
Log.e("===z","没有这一类产品");
}
}
输出结果
![](https://img.haomeiwen.com/i5914881/f01f5b1c4120db0d.png)
5.优点缺点
优点
- 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
- 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。
缺点
- 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
- 违背“开放 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
- 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。
6.应用场景
- 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;
- 当工厂类负责创建的对象(具体产品)比较少时。
OK 简单工厂到此为止 下期 我们讲工厂方法模式