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)

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

posted @ 2016-07-27 22:03  life_start  阅读(395)  评论(0编辑  收藏  举报