工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
由于简单工厂模式不仅对扩展开放了,也对修改开放了(每添加一个类,就得去生成实例的工厂方法中增加新的分支),违背了“开放-封闭原则”。工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行。
public interface Product
{
}
public interface Creator
{
public Product factory();
}
public class ConcreteProduct1 implements Product
{
public ConcreteProduct1()
{
System.out.println("ConcreteProduct1被创建");
}
}
public class ConcreteProduct2 implements Product
{
public ConcreteProduct2()
{
System.out.println("ConcreteProduct2被创建");
}
}
public class ConcreteCreator1 implements Creator
{
public Product factory()
{
return new ConcreteProduct1();
}
}
public class ConcreteCreator2 implements Creator
{
public Product factory()
{
return new ConcreteProduct2();
}
}
public class Client
{
private static Creator creator1, creator2;
private static Product prod1, prod2;
public static void main(String[] args)
{
creator1 = new ConcreteCreator1();
prod1 = creator1.factory();
System.out.println("----------------------------");
creator2 = new ConcreteCreator2();
prod2 = creator2.factory();
}
}
案例 学雷锋
/**
* 工厂方法模式(Factory Method)
* 雷锋类
*/
public class LeiFeng {
public void sweep() {
System.out.println("扫地");
}
public void wash() {
System.out.println("洗衣");
}
public void buyRice() {
System.out.println("买米");
}
}
/**
* 工厂方法模式(Factory Method)
* 雷锋工厂
*/
public interface IFactory {
LeiFeng createLeiFeng();
}
/**
* 学雷锋的大学生工厂
*/
class UndergraduateFactory implements IFactory {
@Override
public LeiFeng createLeiFeng() {
return new Undergraduate();
}
}
/**
* 社区志愿者工厂
*/
class VolunteerFactory implements IFactory {
@Override
public LeiFeng createLeiFeng() {
return new Volunteer();
}
}
/**
* 工厂方法模式(Factory Method)
* 大学生类
*/
public class Undergraduate extends LeiFeng {
@Override
public void sweep() {
System.out.println("学雷锋的大学生帮忙扫地");
}
@Override
public void wash() {
System.out.println("学雷锋的大学生帮忙洗衣");
}
@Override
public void buyRice() {
System.out.println("学雷锋的大学生帮忙买米");
}
}
/**
* 工厂方法模式(Factory Method)
* 社区志愿者类
*/
public class Volunteer extends LeiFeng {
@Override
public void sweep() {
System.out.println("社区志愿者帮忙扫地");
}
@Override
public void wash() {
System.out.println("社区志愿者帮忙洗衣");
}
@Override
public void buyRice() {
System.out.println("社区志愿者帮忙买米");
}
}
/**
* 工厂方法模式(Factory Method)
* 客户端main方法
*/
public class Client {
public static void main(String[] args) {
// 大学生
IFactory undergraduateFactory = new UndergraduateFactory();
LeiFeng student = undergraduateFactory.createLeiFeng();
student.sweep();
student.wash();
student.buyRice();
// 志愿者
IFactory volunteerFactory = new VolunteerFactory();
LeiFeng volunteer = volunteerFactory.createLeiFeng();
volunteer.sweep();
volunteer.wash();
volunteer.buyRice();
}
}