简单工厂模式
- 简单工厂 : 使用一个工厂对象用来生产同一等级结构中的任意产品。(不支持拓展增加产品)
- 工厂方法 : 使用多个工厂对象用来生产同一等级结构中对应的固定产品。(支持拓展增加产品)
- 抽象工厂 : 使用多个工厂对象用来生产不同产品族的全部产品。(不支持拓展增加产品;支持增加产品族)
工厂方法模式的应用
- 何时使用
- 不同条件下创建不用实例时。方法是让子类实现工厂接口。
- 优点
- 良好的封装性,代码结构清晰。如一个调用者想创建一个对象,只需要知道其名称即可,降低了模块间的耦合。
- 扩展性好。如果想增加一个产品,只需扩展一个工厂类即可。
- 屏蔽产品类。调用者只关心产品的接口。
- 典型的解耦框架。
- 缺点
- 每增加一个产品,就需要增加一个产品工厂的类,增加了系统的复杂度。
- 使用场景
- 需要生成对象的地方。
- 需要灵活的、可扩展的框架时。
- 数据库访问,数据库可能变化时。
- 应用实例
- 需要一辆汽车,直接从工厂里面提货,不用去管这辆车是怎么做出来的。
- Hibernate换数据库只需换方言和驱动即可。
- 简单计算器的实现。
使用步骤
- 创建抽象产品类 & 定义具体产品的公共接口;
- 创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
- 创建工厂类,通过创建静态方法根据传入不同参数从而创建不同具体产品类的实例;
- 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
实例
步骤1. 创建抽象产品类,定义具体产品的公共接口
java
abstract class Product{
public abstract void Show();
}步骤2. 创建具体产品类(继承抽象产品类),定义生产的具体产品
//具体产品类A
java
class ProductA extends Product{
@Override
public void Show() {
System.out.println("生产出了产品A");
}
}//具体产品类B
java
class ProductB extends Product{
@Override
public void Show() {
System.out.println("生产出了产品C");
}
}//具体产品类C
java
class ProductC extends Product{
@Override
public void Show() {
System.out.println("生产出了产品C");
}
}步骤3. 创建工厂类,通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例
java
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. 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
//工厂产品生产流程
java
public class SimpleFactoryPattern {
public static void main(String[] args){
Factory mFactory = new Factory();
//客户要产品A
try {
//调用工厂类的静态方法 & 传入不同参数从而创建产品实例
mFactory.Manufacture("A").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
//客户要产品B
try {
mFactory.Manufacture("B").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
//客户要产品C
try {
mFactory.Manufacture("C").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
//客户要产品D
try {
mFactory.Manufacture("D").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
}
}结果输出:
shell
生产出了产品A
生产出了产品C
生产出了产品C
没有这一类产品