1.目标
用于实例化有共同接口的类,由工厂模式动态去实例化所需要的类
三种基本形态:
1.简单工厂
2.工厂方法
3.抽象工厂
2.简单工厂
存在一个静态方法用于接收参数,根据传入的参数去返回实现同一接口不同类的某个类的实例
// 产品接口
public interface product{}
// 产品实现同一接口
pubic class washer implements product{
public washer(){
//打印 生产一台洗衣机
}
}
// public class icebox implements product{
public icebox(){
// 打印 生产一台冰箱
}
}
public class SimpleFactory{
public static product factory(String name){
if("washer".qruals(name)){
return new washer();
else ....
}
}
简单工厂是由工厂根据给出的信息,去创建所需的对象
但简单工厂无法满足产品增加的需求,增加产品就需要对工厂类老代码进行更改
2.工厂方法
为工厂类定义接口,产生生产不同产品的实现同一接口的不同工厂
把生产某种产品的功能放到产品对应的工厂中,去削弱工厂职能
类似于酒厂接口,酒厂下细分红酒厂,白酒厂,啤酒厂,每个厂生产对应的产品
// 同简单工厂一样
1.编写抽象产品接口
2.具体的产品类
// 工厂接口
public interface Factory{
public product create();
}
// 生产洗衣机的工厂
public class WasherFac implements Factory{
public product create(){
return new Washer();
}
public class IceboxFac implements Factory{
public product create(){
return new Icebox();
}
// 有具体的工厂类产生对应的产品
当使用时通过直接new 某个产品的工厂,然后生产该产品即可
3.抽象工厂
含义:用于创建一系列相互关联或相互依赖
扩展的说明:抽象工厂在工厂方法的基础上引入了分类管理,抽象工厂用于创建一系列的产品
示例
这里我们用手机的生产举例,手机简单分为CPU和SCREEN显示屏
CPU会有不止一直型号,SCREEEN显示屏也有多种类型
这时候就可以用抽象工厂对两者进行整合
package StudyJava;
// CPU和SCREEN的接口
public interface CPU {
public void aCPU();
}
interface SCREEN{
public void aSCREEN();
}
package StudyJava;
public class CPU_A implements CPU {
@Override
public void aCPU() {
System.out.println("A型号CPU产品");
}
}
class CPU_B implements CPU{
@Override
public void aCPU() {
System.out.println("B型号CPU产品");
}
}
class SCREEN_A implements SCREEN{
@Override
public void aSCREEN() {
System.out.println("A型号SCREEN产品");
}
}
class SCREEN_B implements SCREEN{
@Override
public void aSCREEN() {
System.out.println("B型号SCREEN产品");
}
}
package StudyJava;
public interface Factory {
// 工厂的接口,这里的工厂接口定义为生产手机的工厂
public CPU getCPU();
public SCREEN getSCREEN();
}
package StudyJava;
public class Factory_A implements Factory {
// 理解为A类型手机工厂,生产A类型的手机,这种手机由A型号CPU和A型号SCREEN组装而成
// 这样就在这里可以将需要关联的两个对象创建在一起
// create生产手机的时候就是会拿到对应型号的CPU和SCREEN然后进行生产
public void create(){
getCPU();
getSCREEN();
}
@Override
public CPU getCPU() {
// TODO Auto-generated method stub
return new CPU_A();
}
@Override
public SCREEN getSCREEN() {
// TODO Auto-generated method stub
return new SCREEN_A();
}
}
class Factory_B implements Factory {
// 理解为B类型手机工厂,生产B类型的手机,这种手机由B型号CPU和B型号SCREEN组装而成
// 这样就在这里可以将需要关联的两个对象创建在一起
@Override
public CPU getCPU() {
// TODO Auto-generated method stub
return new CPU_B();
}
@Override
public SCREEN getSCREEN() {
// TODO Auto-generated method stub
return new SCREEN_B();
}
}
4.小结
工厂设计模式目的就是解耦合,开发者不再去自己创建对象,这样避免了代码维护带来的不便;由工厂动态
决定去创建拥有共同接口的一个具体类的实例
1.简单工厂的思想较为简单,不需要编写工厂接口,不需要多个工厂类,将要生产的产品信息作为参数
提供给简单工厂的静态方法,工厂判断并创建对应的对象
2.工厂方法是编写工厂接口,然后对每个产品去创建属于自己的工厂,需要产品时创建对应的工厂拿到产品
3.抽象工厂有对相关的对象关联到一起的思想,产品接口下对应不同型号的产品类,编写的工厂接口对应生产
一些产品组合后的产品,比如CPU,屏幕等组合成手机;工厂接口包含获取前一类产品对象的方法,拿到这些
产品对象就可以去“生产”手机了,工厂类的实现就是根据需要去组合CPU和屏幕,生产对应型号手机的特定工厂;
抽象工厂实现了对一组具有相同主题的工厂(需要关联的工厂)的封装:
生产手机需要CPU工厂,屏幕工厂,内存工厂等,但抽象工厂下只有一个手机工厂;
但这里的手机工厂覆盖并完成了上述工厂需要完成的所有事;
个人理解这个工厂是抽象意义上的工厂