将动物共有属性和行为抽象为接口
public interface Animal {
/**
* 动物共用的特征
* 吃东西
*/
void eat();
}
实体类
public class Cat implements Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Cat(String name) {
this.name = name;
}
public Cat() {
}
@Override
public void eat() {
System.out.println("猫抓老鼠..");
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
第一步定义抽象工厂类
public abstract class AnimalFactory {
/**
* 返回动物对象
*
* @return
*/
abstract Animal newAnimal();
}
第二步继承抽象工厂类,返回对象
public class CatFactory extends AnimalFactory {
@Override
public Animal newAnimal() {
return new Cat("小黑");
}
}
测试类
/**
* @author jie
* @date 2019/9/10 17:05
* 工厂方法模式
* 工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现
* <p>
* 优点:
* 客户端不需要负责对象的创建,从而明确各个类的职责
* 如果有新的对象增加,只需要添加一个具体的类和具体的实现工厂类即可,不影响已有的代码,后期维护容易,增强了系统的扩展性
* <p>
* 缺点:
* 需要编写额外的代码,增加了工作量
*/
public class AnimalTest {
@Test
public void test1() {
//直接new CatFactory工厂类 获取工厂
final CatFactory catFactory = new CatFactory();
//通过工厂获取Cat实例
final Cat cat = (Cat) catFactory.newAnimal();
cat.eat();
System.out.println("cat = " + cat);
}
}