设计模式专题-03-工厂模式
个人github地址:HibisciDai
设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai
processon在线UML类图:processon
[TOC]
设计模式-03-工厂模式
工厂模式(Factory Pattern)
简单工厂
对象创建的过程过于繁琐和庞大,可能进行同类型扩展,将类的创建单独放在一个类中进行,这个类叫工厂。
在工厂模式中,在创建对象受不会对客户暴露创建逻辑,通过共同的接口来指向新的创建对象。
创建过程延迟到子类进行,让子类决定实例化那个工厂。
意图
定义一个用于创建对象的接口,让子类决定实例化哪个类,一个类的创建延迟到其子类,这个类叫工厂。
主要解决
接口选择。
何时使用
明确计划不同条件下创建不同实例。
关键代码
创建过程在其子类执行。
应用实例
Hibienate换数据库只需要换方言和驱动就可以。
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
新产品增加需要增加具体类和实现工厂,个数成倍增加,增加系统复杂度。
案例1
类图
扩展前:
扩展后:
代码
pattern03.factory.demo1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public interface IFactory { IMonster create(); } public interface IMonster { void show(); } public class ULtraman implements IMonster { @Override public void show() { System.out.println("正义使者"); } } public class ULtramanFactory implements IFactory { @Override public IMonster create() { return new ULtraman(); } }
|
测试输出
1 2 3 4 5 6
| public class Main { public static void main(String[] args) { IFactory a = new ULtramanFactory(); a.create().show(); } }
|
案例2
不同数据库有不同的数据驱动,由用户指定不同的数据驱动。
类图
代码
pattern03.factory.demo2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| public interface Helper { public void open();
public void operation();
public void close(); }
public class SQLHelper implements Helper {
@Override public void open() { System.out.println("SQLHelper-open"); }
@Override public void operation() { System.out.println("SQLHelper-operation"); }
@Override public void close() { System.out.println("SQLHelper-close"); } }
public class OracleHelper implements Helper {
@Override public void open() { System.out.println("OracleHelper-open"); }
@Override public void operation() { System.out.println("OracleHelper-operation"); }
@Override public void close() { System.out.println("OracleHelper-close"); } }
public interface Factory { public Helper create(String helperType); }
public class MyFactory implements Factory {
@Override public Helper create(String helperType) { if (null == helperType) { return null; } else if (helperType.equalsIgnoreCase("SQLHelper")) { return new SQLHelper(); } else if (helperType.equalsIgnoreCase("OracleHelper")) { return new OracleHelper(); } return null; } }
|
测试输出
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Main { public static void main(String[] args) { Factory myFactory = new MyFactory(); Helper helper1 = myFactory.create("SQLHelper"); helper1.open(); helper1.operation(); helper1.close(); Helper helper2 = myFactory.create("OracleHelper"); helper2.open(); helper2.operation(); helper2.close(); } }
|
1 2 3 4 5 6
| SQLHelper-open SQLHelper-operation SQLHelper-close OracleHelper-open OracleHelper-operation OracleHelper-close
|