设计模式一、 工厂方法模式(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);
}
}
}
运行结果如下所示: