zoukankan      html  css  js  c++  java
  • 1 设计模式--工厂方法模式

    工厂方法模式适用于“大量的产品需要频繁创建,并且具有同样的接口时使用”。

    一、普通工厂模式   对于实现了同一个接口的一些类进行统一实例的创建,把这个统一创建的工作交给一个类来实现,这个类就叫做工厂类。

         Job接口 (定义了要做的事情)

    1 public interface Job {
    2     public void say();
    3 }
    View Code

      ReadJob实现类,实现Job接口,实现Job接口定义的方法:

    1 public class ReadJob implements Job {
    2     @Override
    3     public void say() {
    4         System.out.println("This is read Job");
    5     }
    6 }
    View Code

      WriteJob实现类,实现Job接口,实现Job接口定义的方法:

    1 public class WriteJob implements  Job {
    2     @Override
    3     public void say() {
    4         System.out.println("This is write Job");
    5     }
    6 }
    View Code

    普通工厂通过共有方法传递参数的形式获取返回的实例,如

     1 public class SimpleJobFactory {
     2     public static final String READ="read";
     3     public static final String WRITE="write";
     4     public Job produce(String type)
     5     {
     6         if(READ.equalsIgnoreCase(type))
     7         {
     8             return new ReadJob();
     9         }else if(WRITE.equalsIgnoreCase(type))
    10         {
    11             return new WriteJob();
    12         }else
    13         {
    14             System.out.println("Parameter type error,can not create object");
    15             return null;
    16         }
    17     }
    18 }
    View Code

        测试用例:根据参数生成具有统一接口的两个对象实例

    1 public class SimpleJobFactoryTest {
    2     public static void main(String[] args) {
    3         SimpleJobFactory factory=new SimpleJobFactory();
    4         Job job1=factory.produce(SimpleJobFactory.READ);
    5         job1.say();
    6         Job job2=factory.produce(SimpleJobFactory.WRITE);
    7         job2.say();
    8     }
    9 }

    测试输出:

    1 This is read Job
    2 This is write Job

    二、多个方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

    1 public class MethodsJobFactory {
    2     public Job produceReadJob(){
    3         return new ReadJob();
    4     }
    5     public Job produceWriteJob(){
    6         return new WriteJob();
    7     }
    8 }

    测试代码:

    1 public class MethodsJobFactoryTest {
    2     public static void main(String[] args) {
    3         MethodsJobFactory factory=new MethodsJobFactory();
    4         Job job1=factory.produceReadJob();
    5         Job job2=factory.produceWriteJob();
    6         job1.say();
    7         job2.say();
    8     }
    9 }

    测试结果:

    1 1 This is read Job
    2 2 This is write Job

    三、多个静态方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

     1 public class JobStaticFactoryMethod {
     2 
     3     public static Job produceReadJob(){
     4         return new ReadJob();
     5     }
     6 
     7     public static Job produceWriteJob(){
     8         return new WriteJob();
     9     }
    10 }

    或者

    1 public class JobReadStaticFactoryMethod {
    2     public static Job produceReadJob(){
    3         return new ReadJob();
    4     }
    5 }
    1 public class JobWriteStaticFactoryMethod {
    2     public static Job produceWriteJob(){
    3         return new WriteJob();
    4     }
    5 }

    测试代码:

    1 public class JobStaticFactoryMethodTest {
    2     public static void main(String[] args) {
    3         Job job1=JobStaticFactoryMethod.produceReadJob();
    4         Job job2=JobStaticFactoryMethod.produceWriteJob();
    5         job1.say();
    6         job2.say();
    7     }
    8 }

    public class StaticFactoryMethodTest {
        public static void main(String[] args) {
    
            Job job1=JobReadStaticFactoryMethod.produceReadJob();
            Job job2=JobWriteStaticFactoryMethod.produceWriteJob();
            job1.say();
            job2.say();
        }
    }

    测试结果:

    1 This is read Job
    2 This is write Job

     通常使用的静态工厂的使用方法比较好,普通工厂模式和多个静态方法模式都不太好用。

    下一篇对抽象工厂模式进行学习。2016-07-27  22:02:40

    工厂方法模式:

      上面的静态工厂方法虽然有一定的应用场景,但当增加新的业务实现时,往往需要增加新的实现类实现Job接口,同时在MethodsJobStaticFactory工厂类中增加静态方法或者新增加工厂类。增加静态方法的方式:当业务场景比较复杂时,修改已有的类,难免会造成一些意想不到的问题;增加工厂类的方式:已有的代码不能复用,要重新编写,会增加代码量,但如果这种方式写工厂类,但是都实现统一的接口,那么增加业务时,代码既可以复用,又不必修改已有的类,下面是相应的代码:

          统一的工厂类接口:

    1 public interface IAbstractFactoryJob {
    2 
    3     public Job produce();
    4 }

      工厂实现类1:

    1 public class JobReadAbstractFactoryJobImpl implements IAbstractFactoryJob {
    2 
    3 
    4     @Override
    5     public Job produce() {
    6         return new ReadJob();
    7     }
    8 }

      工厂实现类2:

    1 public class JobWriteAbstractFactoryJobImpl implements IAbstractFactoryJob{
    2 
    3     @Override
    4     public Job produce() {
    5         return new WriteJob();
    6     }
    7 }

    测试:

     1 public class AbstractFactoryJobTest {
     2     public static void main(String[] args) {
     3         IAbstractFactoryJob factory1=new JobReadAbstractFactoryJobImpl();
     4         Job job1=factory1.produce();
     5         IAbstractFactoryJob factory2=new JobWriteAbstractFactoryJobImpl();
     6         Job job2=factory2.produce();
     7         job1.say();
     8         job2.say();
     9     }
    10 }

    输出结果:

    This is read Job
    This is write Job

      工厂方法模式的好处是: 如果你想增加一个功能,只需写一个实现类实Job接口,同时写一个工厂类实现IAbstractFactoryJob 接口,就OK了,无需改动其他代码。

      工厂设计模式要根据具体的场景使用,当业务简单或者根本不适合使用设计模式时,不要为了使用设计模式而使代码结构复杂,导致代码可阅读性差,结构复杂等问题。2016-08-0121:21:36

    二、设计模式的六大原则

    总原则:开闭原则(Open Close Principle)

    开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。

    1、单一职责原则

    不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。


    2、里氏替换原则(Liskov Substitution Principle)

    里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里 氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现 抽象化的具体步骤的规范。—— From Baidu 百科

    历史替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。


    3、依赖倒转原则(Dependence Inversion Principle)

    这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。


    4、接口隔离原则(Interface Segregation Principle)

    这个原则的意思是:每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。


    5、迪米特法则(最少知道原则)(Demeter Principle)

    就是说:一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。

    最少知道原则的另一个表达方式是:只与直接的朋友通信。类之间只要有耦合关系,就叫朋友关系。耦合分为依赖、关联、聚合、组合等。我们称出现为成员变量、 方法参数、方法返回值中的类为直接朋友。局部变量、临时变量则不是直接的朋友。我们要求陌生的类不要作为局部变量出现在类中。


    6、合成复用原则(Composite Reuse Principle)

    原则是尽量首先使用合成/聚合的方式,而不是使用继承。

  • 相关阅读:
    【转】SpringCloud学习
    Springboot中配置druid
    阿里云sql监控配置-druid
    Linux中Java开发常用的软件总结:
    java 搞笑注释
    Python之路-pandas包的详解与使用
    Python之路-numpy模块
    Python之路-Python中的线程与进程
    Python之路-Python常用模块-time模块
    Python之路-Python中文件和异常
  • 原文地址:https://www.cnblogs.com/yangh2016/p/5712531.html
Copyright © 2011-2022 走看看