设计模式-简单工厂模式

来源:互联网 发布:宠物美容剪刀 知乎 编辑:程序博客网 时间:2024/04/29 00:08

说起23种设计模式,对于每个开发人员来说并不会感到陌生,但是真正去掌握好它、真正去应用好它却不是一件简单的事情。简单工厂模式是23种设计模式中的一种,也是相对简单一点应用比较广泛的一种设计模式,下面我们就详细介绍下简单工厂模式。
来吧兄弟们,我们走起。先来看下简单工厂模式的定义。

简单工厂模式定义

简单工厂模式是专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式,属于类的创建型模式。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
该模式中包含的角色及其职责
1、工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2、抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3、具体产品(Concrete Product)角色

来张图瞧瞧吧,让我们更直观的看下简单工厂的构成。



简单工厂模式的优点

工厂类是整个模式的关键。包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的。明确了各自的职责和权利,有利于整个软件体系结构的优化。

简单工厂模式的缺点

由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
这些缺点在工厂方法模式中得到了一定的克服。

使用场景   

1、工厂类负责创建的对象比较少;
2、客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
3、由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

简单工厂模式的实际应用简介: 

作为一个最基本和最简单的设计模式,简单工厂模式却有很非常广泛的应用,我们这里以Java中的JDBC操作数据库为例来说明。

还是直接看图说话吧。



将此图结合上一个图我们不难发现简单工厂模式在日常开发中的应用。

JDBCJava应用程序与各种关系数据进行对话的一种机制。用JDBC进行数据库访问时,要使用数据库厂商提供的驱动程序接口与数据库管理系统进行数据交互。

客户端要使用数据时,只需要和工厂进行交互即可,这就导致操作步骤得到极大的简化,操作步骤按照顺序依次为:注册并加载数据库驱动,一般使用Class.forName();创建与数据库的链接Connection对象;创建SQL语句对象preparedStatement(sql);提交SQL语句,根据实际情况使用executeQuery()或者executeUpdate();显示相应的结果;关闭数据库。

看了这么多,是不是迫不及待想看看代码了? 哎   这是我们开发人员的通病啊,好吧上代码。

1 、 抽象(Product)角色


public interface Login {
//登录验证
public boolean verify(String name , String password);
}


2 、具体产品(Concrete Product)角色


public class PasswordLogin implements Login {

@Override
public
String verify(String name, String password) {
// TODO Auto-generated method stub
/**
* 具体的业务逻辑代码,如下简写
*/
String flag = "";
if(name != null && name == "admin"){
flag = "true";
}else{
flag = "false";
}
return flag;
    }
}


3、工厂(Creator)角色


public class LoginManager {
public static Login factory(String type){
if(type.equals("password")){

return new PasswordLogin();

}else if(type.equals("passcode")){

return new DomainLogin();

}else{
throw new RuntimeException("我啥都没看见");
}
}
}

测试类:

public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String loginType = "password";
String name = "name";
String password = "password";
Login login = LoginManager.factory(loginType);
String bool = login.verify(name, password);
if (bool.equals("true") {
System.out.println("没问题,搞定!");
}
else {
System.out.println("问题大了我跟你说!");
}
}
}
好啦,不早了。今天先写到这吧,写的不好但是还是希望能够帮助大家理解简单工厂模式。  晚安吧兄弟们。


 

 


0 0