简单工厂模式
概念:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
组成:
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
类图:
举例:
有一个动物类,我们要创建猫类,狗类。用简单工厂模式实现。
动物抽象类:
public abstract class Animal {
public abstract void eat();
}
动物工厂类:
public class AnimalFactory {
private AnimalFactory() {
}
public static Animal createAnimal(String type) {
if ("dog".equals(type)) {
return new Dog();
} else if ("cat".equals(type)) {
return new Cat();
} else {
return null;
}
}
}
动物具体类:
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}<pre name="code" class="java">public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃老鼠");
}
}
测试类:
public class AnimalTest {
public static void main(String[] args) {
Animal a = AnimalFactory.createAnimal("dog");
a.eat();
a = AnimalFactory.createAnimal("cat");
a.eat();
}
}
这样我们就可以通过一个工厂帮我们创建一个我们需要的对象,而不去管工厂里面是怎样实现的,总之我要什么样的给我什么样的就可以了。
工厂方法模式
概念:一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。“一对一”的关系。
组成:
1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
类图:
举例:我们还以动物的例子为例
动物抽象类:
public abstract class Animal {
public abstract void eat();
}
工厂抽象类:
public abstract class AnimalFactory {
public abstract Animal createAnimal();
}
动物具体类:
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃老鼠");
}
}
工厂具体类:
public class CatFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat();
}
}
public class DogFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
}
测试类:
public class AnimalTest {
public static void main(String[] args) {
// 使用狗工厂
AnimalFactory af = new DogFactory();
Animal a = af.createAnimal();
a.eat();
af = new CatFactory();
a = af.createAnimal();
a.eat();
af = new PigFactory();
a = af.createAnimal();
a.eat();
}
}
这样我们就通过工厂方法模式完成了动物类的创建。
二者比较:
运用两种方式都可以完成我们的需求,可是如果我们相加一个猪类呢,用简单工厂的方式我们需要写一个猪类,然后更改动物工厂。这样就不满足我们的开闭原则,可是工厂方法模式就可以完成我们新增一个类的需求,而且不需要破坏开闭原则。我们想加一个猪类只需增加一个猪类继承抽象动物类,增加一个具体的猪类工厂类,继承动物工厂抽象类即可。
猪类:
public class Pig extends Animal {
@Override
public void eat() {
System.out.println("猪吃饲料");
}
}
猪工厂:
public class PigFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Pig();
}
}
测试类:
public class AnimalTest {
public static void main(String[] args) {
af = new PigFactory();
a = af.createAnimal();
a.eat();
}
}
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成就可以了。