设计模式-工厂模式

工厂模式是一个大的家族   包括以下三种

         简单工厂模式         一个工厂负责所有产品

         工厂方法模式         一个具体工厂负责具体产品

         抽象工厂模式

工厂模式作用:将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑

 

 

简单工厂模式又称为静态工厂方法模式

1.问题 service实现类 需要依赖 dao实现类 

public interface NewsDao {
    public void save(News news);
}
NewsDao
public class NewsDaoImpl implements NewsDao {
    @Override
    public void save(News news) {
        System.out.println("\"保存到数据库\" = " + "保存到数据库");
    }
}
NewsDaoImpl
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 +
                '}';
    }
}
News
public interface NewsService {
    public void save(News news);
}
NewsService
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功能接口  它的实现类

public interface JDBC {
    /**
     * 返回JDBC管理对象
     */
    public void getManager();
}
JDBC
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();
    }
}

 使用工厂方法模式的时序图

 

 

 

 原来调用的时序图

 

 

 
 
 
posted @ 2020-12-23 11:14  wf.zhang  阅读(131)  评论(0编辑  收藏  举报