设计模式之工厂方法实际案例

Posted jinshuaishuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之工厂方法实际案例相关的知识,希望对你有一定的参考价值。

这两天在看SpringCloud相关源码,发现里面使用了大量的设计模式,具体的有工厂方法模式,适配器设计模式,装饰设计模式等。

具体的体现是有这样一个接口:DataBuffer,与之对应的有个DataBufferFactory接口,这个接口用于生产DataBuffer对象,看完这两个接口,及其实现,自己模拟这个设计模式,实现了一套工厂方法设计模式:

首先定义一个Animal接口:用于封装动物共有的行为。eat和sleep

public interface Animal

public void eat();

public void sleep();

创建一个AnimalFactory,用于创建生产各种动物的工厂,注意,我这里使用的是创建生产各种动物的工厂,

public interface AnimalFactory

Animal getAnimal();

Animal getAnimal(String name);

Animal getAnimal(String name,String color);

有以下几种动物:
DefaultAnimal,Dog,Bird,都实现Animal,说明DefaultAnimal,Dog,Bird都是Animal的子类,

public class DefaultAnimal implements Animal

private String name;

private String color;

public String getName()
return name;

public void setName(String name)
this.name = name;

public String getColor()
return color;

public void setColor(String color)
this.color = color;

public DefaultAnimal()
super();


public DefaultAnimal(String name)
super();
this.name = name;


public DefaultAnimal(String name,String color)
super();
this.name = name;
this.color = color;


@Override
public void eat()
System.out.println((name == null ? "动物":name)+ "吃肉");

@Override
public void sleep()
System.out.println((name == null ? "动物":name) + "睡觉");

public class Dog implements Animal

private String name;

private String color;

public String getName()
return name;

public void setName(String name)
this.name = name;

public String getColor()
return color;

public void setColor(String color)
this.color = color;

public Dog()


public Dog(String name)
this.name = name;


public Dog(String name, String color)
super();
this.name = name;
this.color = color;

@Override
public void eat()
System.out.println((name == null ? "动物":name)+ "吃肉");

@Override
public void sleep()
System.out.println((name == null ? "动物":name) + "睡觉");


public void lookHome()
System.out.println((name == null ? "动物" : this.name) + "看家");

public class Bird implements Animal

private String name;

private String color;

public String getName()
return name;

public void setName(String name)
this.name = name;

public String getColor()
return color;

public void setColor(String color)
this.color = color;

public Bird()


public Bird(String name)
this.name = name;



public Bird(String name, String color)
super();
this.name = name;
this.color = color;


@Override
public void eat()
System.out.println((name == null ? "动物":name)+ "吃肉");

@Override
public void sleep()
System.out.println((name == null ? "动物":name) + "睡觉");


public void fly()
System.out.println((name == null ? "动物":this.name) + "飞行");

现在,已经有了具体的Animal的实现,也就是说,有了具体的动物,

下面就建造具体的生产动物的工厂,

默认的动物工厂:

public class DefaultAnimalFactory implements AnimalFactory

@Override
public Animal getAnimal()
return new DefaultAnimal();

@Override
public Animal getAnimal(String name)
return new DefaultAnimal(name);

@Override
public Animal getAnimal(String name, String color)
return new DefaultAnimal(name, color);

生产狗的工厂:

public class DogFactory implements AnimalFactory

@Override
public Animal getAnimal()
return new Dog();

@Override
public Animal getAnimal(String name)
return new Dog(name);

@Override
public Animal getAnimal(String name, String color)
return new Dog(name,color);

生产鸟的工厂:

public class BirdFactory implements AnimalFactory

@Override
public Animal getAnimal()
return new Bird();

@Override
public Animal getAnimal(String name)
return new Bird(name);

@Override
public Animal getAnimal(String name, String color)
return new Bird(name,color);

至此:一共创建了生产三种种类动物的工厂,如果客户有需求,想要一条狗对象,那么就可以利用狗工厂,生产一条狗出来,如果客户想要一只猫,ok,那么我们就建造一个猫工厂,用于生产猫,满足客户的需求:CatFactory 实现 AnimalFactory

下面看一个具体的使用:

public class FactoryDemo
public static void main(String[] args)

//生产一个默认的动物
AnimalFactory defaultFactory = new DefaultAnimalFactory();
Animal defaultAnimal = defaultFactory.getAnimal();

defaultAnimal.eat();
//利用狗工厂生产一条狗
AnimalFactory dogFactory = new DogFactory();
Dog dog = (Dog) dogFactory.getAnimal("大黄"); //此处想要调用子类的lookHome方法,所以必须强转为Dog对象

dog.eat();
dog.sleep();
dog.lookHome();


以上是关于设计模式之工厂方法实际案例的主要内容,如果未能解决你的问题,请参考以下文章

案例分析:设计模式与代码的结构特性——工厂方法模式

设计模式之工厂方法模式

设计模式之工厂方法模式

设计模式之工厂方法模式

设计模式之工厂模式-工厂方法(02)

设计模式之工厂模式类图