java设计模式(1)---简单工厂模式

前提声明:
以下均是本人软件设计与体系结构老师上课所讲授的内容,本人写这系列文章目的主要是加深对于这些知识的印象,以及帮助有需要理解相关知识的朋友。


简单工厂模式:定义一个工厂类,根据参数的不同,返回不同类型的实例,被创建的实例通常都具有相同的父类。

简单工厂模式下共分为三种类型的类,
一是: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;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值