工厂模式的出现缘由很简单:就是给我们创建对象.有人可能会问,问什么不直接new对象,这里简单的解释下,有些对象的创建比较复杂,我们使用工厂类来创建对象会使我们的代码看起来更简洁
工厂设计模式主要有三种:
简单工厂设计模式
工厂方法设计模式
抽象工厂设计模式
看起来很复杂的样子,给人混乱的感觉,下面简单来分析下这几种设计模式
1.简单工厂设计模式
/**
* 定义一个动物的接口
* @author SS
*
*/
public interface IAnimals {
//动物都有吃和睡的方法
public void eat();
public void sleep();
}
/**
* 定义一个动物类的具体实现类,猫
* @author SS
*
*/
public class Cat implements IAnimals{
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("猫晚上睡觉");
}
}
/**
* 定义一个动物类的具体实现类,狗
* @author SS
*
*/
public class Dog implements IAnimals{
public void eat() {
System.out.println("狗吃骨头");
}
public void sleep() {
System.out.println("狗白天睡觉");
}
}
/**
* 定义生产动物的工厂类
* @author SS
*
*/
public class AnimalFactory {
public static IAnimals creatAnimal(String animal){
if("cat".equals(animal)){
return (IAnimals)new Cat();
}else if("dog".equals(animal)){
return (IAnimals) new Dog();
}
return null;
}
}
public class UseAnimal {
public static void main(String[] args) {
IAnimals cat = AnimalFactory.creatAnimal("cat");
cat.eat();
cat.sleep();
IAnimals dog = AnimalFactory.creatAnimal("dog");
dog.eat();
dog.sleep();
}
}
输出结果:
猫吃鱼
猫晚上睡觉
狗吃骨头
狗白天睡觉
从上面可以看出,简单工厂模式使用很简单,但是现在遇到一个问题,如果我还想增加一种动物,比如狗熊,这样的话我们就需要改工厂类,以及增加一个动物品种.每次有增加动物的需求我们就修改工厂类确实比较麻烦,这就引出了工厂方法设计模式
2.工厂方法设计模式
这个设计模式和简单工厂设计模式差不多,只不过简单工厂模式只有一个工厂而工厂方法设计模式有多个工厂,生产每种产品(也就是对象)都有自己的工厂,这样的话,面对上面的需求不会修改工厂类,但是会增加产品类和工厂类,也是很麻烦.
工厂设计模式和简单工厂设计模式其实很相似,下面可以使用反射稍微简化下代码
使用反射的好处是在增加产品的情况下不用修改工厂类
public class AnimalFactory2 {
public static IAnimals creatAnimal(Class c){
IAnimals animal = null;
try {
animal = (IAnimals) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return animal;
}
}
现在突然有了新的需求,我们要创建会飞的猫,怎么办?引入抽象工厂设计模式
3.抽象工厂设计模式
理解抽象工厂,着重理解一点,就是抽象工厂重点是在给产品分类,比如下面的例子
会飞的猫是一类,不会飞的猫是一类.不要把重点放到产品类上,理解抽象工厂模式一定要注意其分类的特点,就是这个工厂可以生产几类产品.
比如我们提前准备好的产品类有Car.class,Fruit.class
还有这两大类的细分类:Audio.class,Tesla.class,Apple.class,Bananan.class.
上面这四小类我们就可以看成两大类,car和fruit,然后可以让一个工厂类去生产这两类产品
代码举例:
/**
* 定义一个动物的接口
* @author SS
*
*/
public interface IAnimals {
//动物都有吃和睡的方法
public void eat();
public void sleep();
}
/**
* 会飞的接口
* @author SS
*
*/
public interface IFly {
public void fly();
}
/**
* 定义一个动物类的具体实现类,猫
* @author SS
*
*/
public class Cat implements IAnimals{
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("猫晚上睡觉");
}
}
/**
* 定义会飞的猫
* @author SS
*
*/
public class FlyCat implements IAnimals,IFly{
public void fly() {
System.out.println("会飞的猫");
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
@Override
public void sleep() {
System.out.println("猫晚上睡觉");
}
}
public class UseAnimal {
public static void main(String[] args) {
CatFactory f = new CatFactory();
//创建普通的猫,并调用里面的方法,普通的猫没有fly的方法
f.creatAnimal().eat();
//创建会飞的猫,并调用它的fly()方法
f.creatFlyAnimal().fly();
}
}
代码的举例方式有很多,关键是抓住重点,本设计模式的重点是创建对象的几个工厂类而不是产品类,切记!