zoukankan      html  css  js  c++  java
  • 设计模式之 《简单工厂》

    简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些。因为它至少不是23种设计模式之一。但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导。

    简单工厂就是把创建逻辑封装起来,通过type或者 类类型 区分创建不同的实例返回给客户端。

    模式结构

    简单工厂模式包含如下角色:
    Factory:工厂角色
    Product:抽象产品角色
    ConcreteProduct:具体产品角色

    工厂角色:工厂角色负责根据参数不同,创建不同的实例对象。

    抽象产品角色:负责申明所有具体实现的通用接口,例如 Course接口,定义方法,study(String type)

    具体产品角色:继承抽象产品角色, 工厂角色产出物为具体产品角色的某一个具体对象,具体产品对象一般为多个;

    下面给一个demo实例

    正常情况下,我们创建一个

    提供抽象产品,创建Source接口,接口提供study接口

    package com.dsx.design.simpledesign;
    
    public interface Source {
        public void study();
    }
    

     编写具体产品角色,编写JavaSource,EnglishSource,都继承自Source接口,对study方法实现。

    package com.dsx.design.simpledesign;
    
    public class EnglishSource implements Source {
    
        public void study() {
            System.out.println("学习Enlish source");
        }
    }
    package com.dsx.design.simpledesign;
    
    public class JavaSource implements Source {
        public void study() {
            System.out.println("学习java课程");
        }
    }

    最后我们提供工厂角色,负责生产具体实例 。

    package com.dsx.design.simpledesign;
    
    public abstract class SourceFactory {
    
        public static Source getSource(String type){
            if("java".equalsIgnoreCase(type)){
                return new JavaSource();
            }else if("Enhlish".equalsIgnoreCase(type)){
                return new EnglishSource();
            }
            return  null ;
        }
    }

    然后编写单元测试,测试

    package com.dsx.design.simpledesign;
    
    public class Test {
    
        public static void main(String[] args) {
            Source source = SourceFactory.getSource("java");
            source.study();
        }
    }

    这个时候我们就可以根据不同的type生产不同的Source实例,但是如果我们需要添加具体实现的话,就需要修改SourceFactory的代码,添加if判断,这个并不符合开闭原则(对修改关闭,对扩展放开)

    所以我们优化上面Factory代码为:

        public static Source getSource(Class cls){
            Source source = null ;
            try {
                try {
                    source = (Source) Class.forName(cls.getName()).newInstance();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return source ;
        }

    修改单元测试为:

     public static void main(String[] args) {
            Source source = SourceFactory.getSource(JavaSource.class);
            source.study();
        }

    上面优化后的代码通过反射实现, 当需要添加具体实现时并不需要修改工厂方法。

  • 相关阅读:
    Windows PowerShell 2.0之进程管理
    PowerShell 2.0远程管理之交互式远程线程
    PowerShell 2.0解析、格式化及显示远程输出
    PowerShell 2.0语言远程管理之理解线程配置
    PowerShell 2.0远程管理之隐式远程管理
    PowerShell 2.0如何将远程线程保存在本地
    Windows PowerShell 2.0之服务管理
    PowerShell 2.0远程管理开发使用CredSSP处理多跳授权
    通过PowerShell操作事件日志
    (译)Silverlight教程第七部分: 使用控件模板定制控件的观感
  • 原文地址:https://www.cnblogs.com/wenq001/p/10059408.html
Copyright © 2011-2022 走看看