ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式-工厂模式

2021-10-29 20:04:30  阅读:195  来源: 互联网

标签:package simple 模式 工厂 设计模式 com public yab


简单工厂

简单工厂模式又叫作静态工厂方法模式,有一个具体的工厂类,嗯可以生成多个不同的产品,属于创建型设计模式。

应用场景

对于产品种类相对较少的情况,考虑使用简单工厂模式可以很方便地创建所需产品。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑。

简单工厂模式主要包含3个角色:

  1. 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。
  2. 抽象产品(IProduct):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
  3. 具体产品(ConcreteProduct):是简单工厂模式的创建目标。

package com.yab.simple;

/**
 * IProduct 简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口
 */
public interface ITea{
    //生产茶叶
    public void productionTea();
}
package com.yab.simple;

/**
 * ConcreteProduct 简单工厂模式的创建目标
 */
public class GreenTea implements ITea {
    @Override
    public void productionTea() {
        System.out.println("生产绿茶");
    }
}
package com.yab.simple;

public class RedTea implements ITea {
    @Override
    public void productionTea() {
        System.out.println("生产红茶");
    }
}

package com.yab.simple;

/**
 * SimpleFactory:是简单工厂模式的核心,负责实现创建所有实例的内部逻辑
 */
public class TeaFactory extends RedTea {
    public ITea create(String name){
        if("greenTea".equals(name)){
            return new GreenTea();
        }else if("redTea".equals(name)){
            return new RedTea();
        }else {
            return null;
        }
    }
}

 

package com.yab.simple;

public class Test extends TeaFactory {

    public static void main(String[] args) {
         TeaFactory teaFactory = new TeaFactory();
         teaFactory.create("greenTea").productionTea();
    }

}

到此一个简单工厂产生了。

当业务继续扩展,需要增加新种类的茶,工厂中的create()方法每次都要修改代码逻辑,不符合开闭原则。因此,可以采用反射,对简单工厂模式优化。

package com.yab.simple;

/**
 * 反射优化工厂
 */
public class TeaFactoryRef {
    public ITea createRef(String className){
        try {
            if(!(null==className || "".equals(className))){
                return (ITea) Class.forName(className).newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
package com.yab.simple;

public class TestRef {
    public static void main(String[] args) {
        TeaFactoryRef teaFactoryRef = new TeaFactoryRef();
        ITea iTea = teaFactoryRef.createRef("com.yab.simple.RedTea");
        iTea.productionTea();
    }
}

优化之后,不在需要修改TeaFactoryRef中的代码。但还是有问题,方法参数是字符串(如果输错不就坑了自己),可控性待提升,而且还需要强制转型。 

接着我们继续修改代码。

package com.yab.simple;

public class TeaFactoryLast {
    public ITea createLast(Class<? extends ITea> teaClass){
        try {
            if(null != teaClass){
                return teaClass.newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

 

package com.yab.simple;

public class TestLast {
    public static void main(String[] args) {
        TeaFactoryLast teaFactoryLast = new TeaFactoryLast();
        ITea iTea = teaFactoryLast.createLast(RedTea.class);
        iTea.productionTea();
    }
}

 

标签:package,simple,模式,工厂,设计模式,com,public,yab
来源: https://blog.csdn.net/yanganbang880605/article/details/121041316

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有