一 简介
工厂模式:工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。打个比方:我们需要一样物品,我们只需要拿钱去买来就可以,不用关心它是怎么生产出来的
工厂模式分为三类:
- 简单工厂模式(Simple Factory):不利于产生系列产品;
- 工厂方法模式(Factory Method):又称为多形性工厂;
- 抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品
二 简单工厂模式
特点:
(1)工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
(2)客户端只知道传入工厂类的参数,对于如何创建对象并不关心
生活例子:大家10086最熟悉不过了,我们可以通过按键来让10086提供我们对应的服务,比如:查话费,充值,办套餐等等
public class SampleFactory {
public String getMessage(Integer result){
String msg = "";// 提示信息
switch (result) {
case 0:
msg ="人工服务";
break;
case 1:
msg = "话费充值业务";
break;
case 2:
msg ="查话费业务";
break;
case 3:
msg = "套餐办理业务";
break;
default:
msg = "其他业务";
break;
}
return msg;
}
}
public class Test1 {
public static void main(String[] args) {
SampleFactory sampleFactory =new SampleFactory();
System.out.println(sampleFactory.getMessage(1));
}
}
这种模式简单,在工作中肯定经常遇见,比如我在之前的系统中定义返回的提示语,就是在BaseController 建立一个getPageMessage的信息提示方法,通过传递入的值,返回对应的提示信息
三 工厂方法模式
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
来看下它的组成:
- 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
- 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
- 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
- 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代 码。可以看出工厂角色的结构也是符合开闭原则的!
生活例子:大家都知道大众集团旗下有各种品牌的车子,比如奥迪,保时捷,高尔夫,帕萨特,朗逸等等。这里的我们可以将整个大众集团抽象为一个抽象工厂角色,代码如下:
public abstract class DaZhongFactory {
abstract Car createCar();
}
建立一个其旗下的aodi的具体工厂角色:
public class AudiFactory extends DaZhongFactory{
@Override
Car createCar() {
// TODO Auto-generated method stub
return new AudiCar();
}
}
抽象工厂生产的是抽象产品,其车子为抽象类
public interface Car {
void around();
}
其对应的具体产品类为奥迪车:
public class AudiCar implements Car{
@Override
public void around() {
System.out.println("奥迪的标志是四个圈");
}
}
测试:
public class Test {
public static void main(String[] args) {
DaZhongFactory audiFactory =new AudiFactory();
Car car=audiFactory.createCar();
car.around();
}
}
其结构图:
四 抽象工厂模式
从上面的工厂方法中的结构图中,我们可以看到其中的具体工厂A和B是两个完全独立的。两者除了都是抽象工厂的子类,没有任何其他的交集。(注意:我上面的按品牌将其完全分离成不相关的产品) 但是,如果我们有这样一个需求:具体工厂A和B需要生产一些同类型的不同产品。那么我们就可以试试抽象工厂模式。(下面这个例子将其按都是车类型,将其归并为相关的产品)
抽象产品接口:
public interface AudiCar{
void around();//奥迪
}
public interface ccCar {
void around();//cc
}
具体产品实现类:
public class MyAudiCar implements AudiCar{
@Override
public void around() {
// TODO Auto-generated method stub
System.out.println("这是一台黑色的奥迪");
}
}
public class MyCcCar implements ccCar{
@Override
public void around() {
System.out.println("这是一台白色的大众cc");
}
}
抽象工厂类:
public abstract class DaZhongFactory {
abstract AudiCar createAudiCar();//奥迪
abstract ccCar createCcCar();//大众cc
}
具体工厂类:
public class MyFactory extends DaZhongFactory{
@Override
AudiCar createAudiCar() {
return new MyAudiCar();
}
@Override
ccCar createCcCar() {
// TODO Auto-generated method stub
return new MyCcCar();
}
}
测试:
public class Test {
public static void main(String[] args) {
DaZhongFactory factory=new MyFactory();
AudiCar audiCar=factory.createAudiCar();
ccCar ccCar=factory.createCcCar();
audiCar.around();
ccCar.around();
}
}
在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。
抽象工厂类,我们在开发中也用到过,BaseDao这个类,把增删查改封装在一起,然后其子类实现此接口,完成具体的对应的操作