用java 编写程序写出简单的工厂模式?

用java 编写程序写出简单的工厂模式?,第1张

java中工厂模式分为:

简单工厂模式(Simple Factory) 

2. 工厂方法模式(Factory Method) 

3. 抽象工厂模式(Abstract Factory)

每种方法的实现不同

提供一个简单工厂模式的案例:

public abstract class Woman {

private String mySkill

public String getMySkill() {

return mySkill

}

public Woman() {

//System.out.println("我是女人")

}

public void setMySkill(String mySkill) {

this.mySkill = mySkill

}

}

----------------------------

public class LovelinessWoman extends Woman{

/*

* 可爱型女人

*/

  public LovelinessWoman()

  {

  String mySkill="撒过颂肆娇、出过轨、誉樱掘勾引领导下过水"

      this.setMySkill(mySkill)

  }

}

-----------------------------

public class SteelinessWoman extends Woman{

/*

* 冷酷型女人

*/

  public SteelinessWoman()

  {

  String mySkill="装过神庆核、弄过鬼,跟别人老公亲过嘴"

      this.setMySkill(mySkill)

  }

}

--------------------------------------

public class WomanMakeFactory {

public Woman findWoman(int typeID) {

switch (typeID) {

case 1:

return new LovelinessWoman()

case 2:

return new VirtuousWoman()

case 3:

return new SteelinessWoman()

default:

return null

}

}

public Woman findWoman(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

/*

* Type t = Type.GetType("SimpleFactory." + type)

* Woman wm =

* (Woman)Activator.CreateInstance(t)return wm

*/

String string="cn.jbit.design.simplefactory."+type

Class c = Class.forName(string)

Woman wm = (Woman) c.newInstance()

return wm

}

}

-------------------------

调用

public class Test2 {

/**

* @param args

* @throws IllegalAccessException

* @throws InstantiationException

* @throws ClassNotFoundException

*/

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

Scanner input=new Scanner(System.in)

boolean sel=false

do {

System.out.println("请选择你要找的女人的类型")

System.out.println("LovelinessWoman:可爱型女人 VirtuousWoman:善良型女人 SteelinessWoman:冷酷型女人")

String typeid=input.next()

       WomanMakeFactory factory = new WomanMakeFactory()

       Woman wm=factory.findWoman(typeid)

       System.out.println("该类型女人的新标准:")

       System.out.println(wm.getMySkill())

     

       System.out.println("还想看看别的类型吗?y代表想,n代表再也不想了")

     

       sel=input.next().equals("y")

} while (sel)

}

}

简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

那么简单工厂模式是在什么场景下使用呢,下面就以本人的理解举例说明:

就拿登录功能宽渣来说,假如应用系统需要支持多种登录方式如:口令认证、域认证(口令认证通常是去数据库中验证用户,而域认证则是需要到微软的域中验证用毁缓户)。那么自然的纤巧模做法就是建立一个各种登录方式都适用的接口,如下图所示:

public interface Login {

//登录验证

public boolean verify(String name , String password)

}

public class DomainLogin implements Login {

@Override

public boolean verify(String name, String password) {

// TODO Auto-generated method stub

/**

* 业务逻辑

*/

return true

}

}

public class PasswordLogin implements Login {

@Override

public boolean verify(String name, String password) {

// TODO Auto-generated method stub

/**

* 业务逻辑

*/

return true

}

}

我们还需要一个工厂类LoginManager,根据调用者不同的要求,创建出不同的登录对象并返回。而如果碰到不合法的要求,会返回一个Runtime异常。

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)

boolean bool = login.verify(name, password)

if (bool) {

/**

* 业务逻辑

*/

} else {

/**

* 业务逻辑

*/

}

}

}

简单工厂模式的结构如下图:

我们可以设想一下真实的场景,如果把上面的Test当做一个servlet的话,当客户端发起登录请求——>请求交给服务端的Servlet——>Servlet根据客户端传递的loginType调用工厂类LoginManager的factory()方法——>factory()方法根据参数loginType创建相应的登录验证类(DomainLogin或PasswordLogin)并返回——>登录验证类调用方法verify()验证用户名密码是否正确

假如不使用简单工厂模式则验证登录Servlet代码如下(假设Test为一个Servlet,变量loginType、name、password表示从客户端传递过来的参数):

public class Test {

public static void main(String[] args) {

// TODO Auto-generated method stub

String loginType = "password"

String name = "name"

String password = "password"

//处理口令认证

if(loginType.equals("password")){

PasswordLogin passwordLogin = new PasswordLogin()

boolean bool = passwordLogin.verify(name, password)

if (bool) {

/**

* 业务逻辑

*/

} else {

/**

* 业务逻辑

*/

}

}

//处理域认证

else if(loginType.equals("passcode")){

DomainLogin domainLogin = new DomainLogin()

boolean bool = domainLogin.verify(name, password)

if (bool) {

/**

* 业务逻辑

*/

} else {

/**

* 业务逻辑

*/

}

}else{

/**

* 业务逻辑

*/

}

}

}

上面的代码会不会很蛋疼啊。。。呵呵

《JAVA与模式》一书中使用java.text.DataFormat类作为简单工厂模式的典型例子叙述。

简单工厂模式的优点

模式的核心是工厂类。这个类含有必要的逻辑判断,可以决定在什么时候创建哪一个登录验证类的实例,而调用者则可以免除直接创建对象的责任。简单工厂模式通过这种做法实现了对责任的分割,当系统引入新的登录方式的时候无需修改调用者。

简单工厂模式的缺点

这个工厂类集中了所以的创建逻辑,当有复杂的多层次等级结构时,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。

这个应该比较简单一点。

某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式。现使用工厂方法模式设计该系统,并写出相应Java代码。

interface Log{

    public void writeLog()

}

class FileLog implements Log{

    public void writeLog(){

        System.out.println("文件记录")

    }

}

class DatabaseLog implements Log{

    public void writeLog(){

        System.out.println("数据库记录")

    }

}

interface LogFactory{

    public Log createLog()

}

class FileLogFactory implements LogFactory{

    public Log createLog(){

        return new FileLog()

    }

}

class DatabaseLogFactory implements LogFactory{

    public Log createLog(){

        return new DatabaseLog()

    }

}

public class Client{

    public static void main(String[] args) {

        try{

            Log log

            LogFactory factory

//这里可以改成使用DOM和Java反射机制读取XML文件,获取工厂类名

      兄敏      factory=new DatabaseLogFactory ()

            log=factory.createLog()

         羡段枝   log.writeLog()

        }

    燃宽    catch(Exception e){

            System.out.println(e.getMessage())

        }

    }

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12277261.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存