今天在慕课上学习了模式的秘密——工厂模式和抽象工厂模式,还需要更加深入地了解。(以下内容整理自慕课网)
传送门:http://www.imooc.com/learn/261
(一) 工厂模式是什么?
实例化对象的时候,我们用工厂方法来代替new操作
工厂模式包括了工厂模式和抽象工厂模式
(二) 工厂模式的意图是什么?
定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化,它将实例化的工作推迟到了子类中去实现。
(三) 什么时候使用工厂模式呢?
有一组类似的对象需要实例化;
在编码时不确定需要创建哪种类的实例;
系统需要考虑扩展性;(譬如,在接下来的开发中,又有新的需求添加进来)
(四) 工厂模式的动机是什么?
在项目中,当一个对象变化时,我们希望依赖于该对象的其他对象不会受到影响。
(五) 工厂模式的代码实现
场景: 画脸蛋
首先,我们定义一个接口,接口中有一个draw方法用于画发型。
public interface HairInterface {
public void draw();
}
然后添加两个发型类——左发型类和右发型类
public class LeftHair implements HairInterface {
@Override
public void draw() {
System.out.println("左偏分发型");
}
}
public class RightHair implements HairInterface {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("右偏分发型");
}
}
我们想给这些发型类一个统一个管理,那么定义一个HairFactory 工厂类。在这个工厂类中对不同发型类的实例化进行统一的管理,根据用户的选择进行实例化。具体是通过类的getInstance()方法来实现的,同时注意这一方法要有try catch语句来避免找不到类的情况。
/*
* 根据需求创建发型对象
*/
public class HairFactory {
public HairInterface getHair(String className) {
try {
HairInterface hair = (HairInterface) Class.forName(className).newInstance();
return hair;
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
throw new RuntimeException();
}
}
(六) 抽象工厂模式的代码实现
首先,我们定义接口男孩和接口女孩
public interface Boy {
public void drawBoy();
}
public interface Girl {
public void drawGirl();
}
然后,定义类圣诞男孩和类新年男孩,类圣诞女孩和类新年女孩,分别实现接口
public class MCBOY implements Boy {
@Override
public void drawBoy() {
System.out.println(" Draw a boy");
}
}
public class MCGirl implements Girl {
@Override
public void drawGirl() {
System.out.println(" Draw a girl");
}
}
public class NYBoy implements Boy {
@Override
public void drawBoy() {
System.out.println("draw a NYBoy");
}
}
public class NYGirl implements Girl {
@Override
public void drawGirl() {
System.out.println("draw a NYGirl");
}
}
接着,不管是男孩女孩,定义一个工厂总管理接口
public interface PrrsonFactory {
public Boy getBoy();
public Girl getGirl();
}
然后,定义圣诞工厂类和新年工厂类,实现总的工厂接口,来作为具体的工厂类管理工具
public class MCFactory implements PrrsonFactory{
@Override
public Boy getBoy() {
// TODO Auto-generated method stub
return new MCBOY();
}
@Override
public Girl getGirl() {
// TODO Auto-generated method stub
return new MCGirl();
}
}
public class NYFactory implements PrrsonFactory{
@Override
public Boy getBoy() {
// TODO Auto-generated method stub
return new NYBoy();
}
@Override
public Girl getGirl() {
// TODO Auto-generated method stub
return new NYGirl();
}
}
这样就实现了上面的抽象工厂模式图。
(七) 常见应用
(八) 总结
从以上我们可以看出,抽象工厂模式可以看成是工厂模式的推广,而工厂模式是抽象工厂模式的一个极端情况。
工厂模式是用来创建一个产品的等级结构,抽象工厂模式可以用来创建多个产品的等级结构。
工厂模式只有一个抽象产品类,抽象工厂模式有多个抽象产品类。