设计模式-工厂模式
工厂模式是一个大的家族 包括以下三种
简单工厂模式 一个工厂负责所有产品
工厂方法模式 一个具体工厂负责具体产品
抽象工厂模式
工厂模式作用:将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑
简单工厂模式又称为静态工厂方法模式
1.问题 service实现类 需要依赖 dao实现类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface NewsDao { public void save(News news); }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class NewsDaoImpl implements NewsDao { @Override public void save(News news) { System.out.println("\"保存到数据库\" = " + "保存到数据库"); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class News implements Serializable{ private int no; private String title; private String author; private Date createTime; public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public News() { } public News(int no, String title, String author, Date createTime) { this.no = no; this.title = title; this.author = author; this.createTime = createTime; } @Override public String toString() { return "News{" + "no=" + no + ", title='" + title + '\'' + ", author='" + author + '\'' + ", createTime=" + createTime + '}'; } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface NewsService { public void save(News news); }
public class NewsServiceImpl implements NewsService{ //NewsServiceImpl 依赖 NewsDaoImpl private NewsDao dao = new NewsDaoImpl(); @Override public void save(News news) { dao.save(news); } }
时序图如下
2.简单工厂模式 解决问题
public class SimpleFactory { public static NewsDao getInstance(){ return new NewsDaoImpl(); } }
public class NewsServiceImpl implements NewsService{ //简单工厂模式是通过工厂类 创建 目标对象 //实质是简单工厂定义了一个创建目标对象的类 封装了实例化对象的行为 private NewsDao dao = SimpleFactory.getInstance(); @Override public void save(News news) { dao.save(news); } }
使用简单工厂的时序图
3.工厂方法模式 简单工厂模式不适合处理逻辑复杂的情况 如果工厂的产品逻辑复杂的话 工厂类难以维护
工厂方法模式是对简单工厂模式的进一步抽象化
3.1 定义JDBC功能接口 它的实现类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface JDBC { /** * 返回JDBC管理对象 */ public void getManager(); }
public class MySQLJDBC implements JDBC { @Override public void getManager() { System.out.println("MySQL JDBC!"); } }
public class OracleJDBC implements JDBC { @Override public void getManager() { System.out.println("Oracle JDBC!"); } }
public class SQLServerJDBC implements JDBC { @Override public void getManager() { System.out.println("SQL Server JDBC!"); } }
3.2 JDBC工厂接口 实现类
public interface JDBCFactory { public JDBC getJDBC(); }
public class MySQLJDBCFactory implements JDBCFactory{ @Override public JDBC getJDBC() { return new MySQLJDBC(); } }
public class OracleJDBCFactory implements JDBCFactory{ @Override public JDBC getJDBC() { return new OracleJDBC(); } }
public class SQLServerJDBCFactory implements JDBCFactory{ @Override public JDBC getJDBC() { return new SQLServerJDBC(); } }
3.3 使用定义 工厂接口的子类工厂 完成具体产品的功能
public class JDBCOperating { //原来的操作 private JDBC jdbc=new MySQLJDBC(); private JDBC jdbc; public void setJdbc(JDBC jdbc) { this.jdbc = jdbc; } public void use() { jdbc.getManager(); } public static void main(String[] args) { JDBCOperating operating=new JDBCOperating(); //工厂类对象 JDBCFactory factory=new MySQLJDBCFactory();//创建工厂对象 JDBC jdbc=factory.getJDBC();//获得JDBC: 功能类型 //工厂对象,传入到目标类中 operating.setJdbc(jdbc);//将功能类传入到 目标类中: setter operating.use(); } }
使用工厂方法模式的时序图
原来调用的时序图
古人学问无遗力,少壮工夫老始成。
纸上得来终觉浅,绝知此事要躬行。