设计模式一、 工厂方法模式(Factory Method Pattern)

设计模式一、 工厂方法模式(Factory Method Pattern)
一、概念:定义一个用于创建对象的接口,让子类决定将哪个工厂类实例化。
(Factory Method使得一个类的实例化延迟到其子类)
二、目的:解决接口选择的问题。
三、方式:让其子类实现方法接口,重写接口中的方法;不同的子类中,不同的实现。
四、使用的条件:明确的计划,不同的条件下创建不同的实例。
作为一种创建类模式,任何需要生成复杂对象的地方,都可以使用工厂方法模式。
五、优点和缺点:
优点:如果想要创建一个对象,只需要知道名称即可;
如果想要增加一种产品,只需要扩展一个工厂类即可;
调用者只需要明确产品的接口即可,不需要知道产品的具体实现。
缺点: 每次增加一个产品,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,增加了系统的复杂度; 也增加了系统具体类的依赖。
六、实现:
整个工厂方法模式由四大部分组成——接口、接口的实现类、工厂类、主函数。
举个例子来说:
1、创建一个接口,在这个接口中封装了一个方法,比如生产汽车发动机的方法;
2、然后再创建几个类,去实现这个接口,重写该接口中的方法,比如一个类里是生产宝马的发动机的方法、一个类是生产奔驰的发动机的方法、还有一个是生产大众的发动机的方法;
3、 创建工厂类,基于给定的信息,创建对应的实体类的对象;
4、创建一个包含主函数的类,使用工厂类的方法传递信息,获取相应实体类的对象,然后调用对应的方法。

七、下面就是用java具体实现工厂方法模式了(与例子中的方法顺序对应)——
1、创建接口
package com.zyc.Factory_Pattern ;

/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:09:56
* To change this template use File | Settings | File Templates.
*/
public interface Shape {
void draw () ;
}

2、创建接口的实现类

第一个实现类Circle:
package com.zyc.Factory_Pattern ;

/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:09:57
* To change this template use File | Settings | File Templates.
*/
//画圆
public class Circle implements Shape {
@Override
public void draw () {
System . out . println ( "画画:画圆形的方法...." ) ;
}
}

第二个实现类Triangle:
package com.zyc.Factory_Pattern ;

/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:10:05
* To change this template use File | Settings | File Templates.
*/
public class Triangle implements Shape {
@Override
public void draw () {
System . out . println ( "画画:画三角形的方法...." ) ;
}
}

第三个实现类Rectangle:
package com.zyc.Factory_Pattern ;

/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:10:10
* To change this template use File | Settings | File Templates.
*/
public class Rectangle implements Shape {
@Override
public void draw () {
System . out . println ( "画画:画矩形的方法...." ) ;
}
}

3、创建工厂类
package com.zyc.Factory_Pattern ;

/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:10:19
* To change this template use File | Settings | File Templates.
*/

//创建工厂类,基于给定的信息,创建对应的实体类的对象
public class Factory {

//getShape()方法:通过匹配参数值,获取相应实体类的对象
public Shape getShape ( String type )
{
if ( type == null ) {
return null ;
}
else if ( type . equalsIgnoreCase ( "CIRCLE" )) {
return new Circle () ;
}
else if ( type . equalsIgnoreCase ( "RECTANGLE" )) {
return new Rectangle () ;
} else if ( type . equalsIgnoreCase ( "TRIANGLE" )) {
return new Triangle () ;
}
return null ;
}
}

4、创建该工厂的使用类(主函数)
package com.zyc.Factory_Pattern ;

import java.util.Scanner ;

/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:10:34
* To change this template use File | Settings | File Templates.
*/

//使用工厂类传递信息,获取相应实体类的对象
public class Factory_demo {
public static void main ( String [] args ) {
//实例化工厂类的对象
Factory ft = new Factory () ;

String str = null ;
String str1 = "没有该方法" ;

/*1、默认输入
//通过向gteShape(String type)方法中传入的参数,return得到相应的对象
Shape first=ft.getShape ("CIRCLE");
//用得到的对象去调用对应的方法
first.draw ();

Shape second=ft.getShape ("RECTANGLE");
second.draw ();

Shape third=ft.getShape ("TRIANGLE");
third.draw ();*/

//2、通过获取键盘输入,得到信息
Scanner sc = new Scanner ( System . in ) ;
while ( sc . hasNext ()) {
str = sc . next () ;

if ( str . equals ( "CIRCLE" )) {
new Circle () . draw () ;
}

else if ( str . equals ( "RECTANGLE" )) {
new Rectangle () . draw () ;
}

else if ( str . equals ( "TRIANGLE" )) {
new Triangle () . draw () ;
}
else
System . out . println ( str1 ) ;
}

}
}

运行结果如下所示:


猜你喜欢

转载自blog.csdn.net/Ysunflower/article/details/80760867