前提声明:
以下均是本人软件设计与体系结构老师上课所讲授的内容,本人写这系列文章目的主要是加深对于这些知识的印象,以及帮助有需要理解相关知识的朋友。
简单工厂模式:定义一个工厂类,根据参数的不同,返回不同类型的实例,被创建的实例通常都具有相同的父类。
简单工厂模式下共分为三种类型的类,
一是:Factory(工厂角色)
二是:Product(抽象产品角色)
三是:ConcreteProduct(具体产品角色)
四是:客户端角色
注意点一:工厂(角色)类中用于创建实例的方法通常是静态方法,因此又被称作为静态工厂方法。
注意点二:工厂(角色)类中用于创建实例的方法是返回父类对象,而不是子类的具体对象,这就是所谓“多态”。
接下来以代码的形式介绍:
一是工厂角色:
public class Factory {
//静态工厂方法
public static Product getProduct(String arg) {
Product product = null;
if (arg.equalsIgnoreCase("A")) {
product = new ConcreteProductA();
//初始化设置product
}
else if (arg.equalsIgnoreCase("B")) {
product = new ConcreteProductB();
//初始化设置product
}
return product;
}
}
二是抽象产品角色:
public abstract class Product {
//所有产品类的公共业务方法
public void methodSame() {
//公共方法的实现
}
//声明抽象业务方法
public abstract void methodDiff();
}
三是具体产品角色:
public class ConcreteProduct extends Product{
//实现业务方法
public void methodDiff() {
//业务方法的实现
}
}
四是客户端角色:
public class Client {
public static void main(String args[]) {
Product product;
product = Factory.getProduct("A"); //通过工厂类创建产品对象
product.methodSame();
product.methodDiff();
}
}
一个实例:
注:本实例是本人课程老师出的题,非本人原创,拿过来只是更形象给大家展示:
题目如下:
7-1 简单工厂模式 (100 分)
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果向造人的工厂方法传入参数“M”,则返回一个男人(Man)对象,如果传入参数“W”,则返回一个女人(Woman)对象,如果传入参数“R”,则返回一个机器人(Robot)对象,其中,男人、女人以及机器人均有eat()方法以及sleep()方法,具体要求如下:
每个实体类的无参构造方法中均要输出一行字符串:类名 is constructed.
eat()方法输出如下字符串:类名 is eating.
sleep()方法输出如下字符串:类名 is sleeping.
尝试构建测试类(Main),由用户输入M、W或者R,创建对应的对象,然后调用该对象的eat()及sleep()两个方法,如果用户输入非法,输出“Wrong Format.”
输入格式:
输入一个字符,范围为{“M”,“W”,“R”}
输出格式:
按照题目要求根据程序执行顺序进行输出。
输入样例:
在这里给出一组输入。例如:
R
输出样例:
在这里给出相应的输出。例如:
Robot is constructed.
Robot is eating.
Robot is sleeping.
对应代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//注意这里工厂方法是调用自己的静态方法,
//而不是声明一个工厂类再调用它的方法
Person person = PersonFactory.createPerson(input.next());
if(person != null) {
person.eat();
person.sleep();
}
}
}
abstract class Person {
public abstract void eat();
public abstract void sleep();
}
class Man extends Person{
public Man() {
System.out.println("Man is constructed.");
}
public void eat() {
System.out.println("Man is eating.");
}
public void sleep() {
System.out.println("Man is sleeping.");
}
}
class Woman extends Person{
public Woman() {
System.out.println("Woman is constructed.");
}
public void eat() {
System.out.println("Woman is eating.");
}
public void sleep() {
System.out.println("Woman is sleeping.");
}
}
class Robot extends Person{
public Robot() {
System.out.println("Robot is constructed.");
}
public void eat() {
System.out.println("Robot is eating.");
}
public void sleep() {
System.out.println("Robot is sleeping.");
}
}
class PersonFactory {
//注意工厂方法中创建对应的
public static Person createPerson(String type) {
//注意工厂类创建具体产品的方法返回的是
//父类(而不是具体子类),这就是多态
Person person = null;
if("M".equals(type)) {
person = new Man();
}
else if("W".equals(type)) {
person = new Woman();
}
else if("R".equals(type)) {
person = new Robot();
}
else {
System.out.println("Wrong Format.");
}
return person;
}
}