工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
1 为什么需要工厂模式?
以类Clothes为例,如果我们要创建Clothes的实例对象:
Clothes clothes = new Clothes();
这是一个简单的new的过程,而当我们需要进行一些相关的初始化工作时(比如赋值),我们可以使用Clothes的构造函数,
Clothes clothes = new Clothes(..);
但是,初始化工作有可能是一个相当复杂的过程,仍然使用构造函数,那可能会是很难看的一段长的代码,就需要Refactor重构。
为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如果是很长一段代码,说明要做的工作很多,
将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有悖于Java面向对象的原则, 面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间耦合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。
2 简单工厂模式:
1) 定义一个Clothes接口,具体的(如Suit)实现类实现Clothes内部方法,达到封装的效果(减少因为修改了部分内容而造成重大事故的几率)。
2) 抛弃以往的直接new Clothes()的方式,定义一个Factory类,在内部定义createClothes方法,通过Factory类去制造衣服。
3 具体实现代码
3.1 定义Clothes接口
/**
* @Description: 服装 父类接口
* @Author: qiuxx
* @Date: 22:10 2018/6/17
*/
public interface Clothes {
/**
* 衣服名称
*/
public void clothingCategory();
/**
* 适用场合
*/
public void applicableOccasion();
}
3.2 实现类Suit、DownJackets、Sportswear
/**
* @Description: 西装
* @Author: qiuxx
* @Date: 22:16 2018/6/17
*/
public class Suit implements Clothes {
@Override
public void clothingCategory() {
System.out.println("类别:西装");
}
@Override
public void applicableOccasion() {
System.out.println("适合商务洽谈、重要会议等");
}
}
/**
* @Description: 羽绒服
* @Author: qiuxx
* @Date: 22:16 2018/6/17
*/
public class DownJackets implements Clothes {
@Override
public void clothingCategory() {
System.out.println("类别:羽绒服");
}
@Override
public void applicableOccasion() {
System.out.println("适合寒冷的冬季,保暖、抗寒");
}
}
/**
* @Description: 运动衣
* @Author: qiuxx
* @Date: 22:16 2018/6/17
*/
public class Sportswear implements Clothes {
@Override
public void clothingCategory() {
System.out.println("类别:运动衣");
}
@Override
public void applicableOccasion() {
System.out.println("适合运动时间穿着");
}
}
4 制造衣服的工厂类ClothesFactory
/**
* @Description: 服装工厂
* @Author: qiuxx
* @Date: 22:25 2018/6/17
*/
public class ClothesFactory {
//定义一个制衣厂,将衣服类型传入,便制造出了衣服
public static Clothes createClothes(Class c) {
Clothes clothes = null;
try {
clothes = (Clothes) Class.forName(c.getName()).newInstance();//制造一件衣服
return clothes;
} catch (InstantiationException e) {
System.out.println("必须指定好衣服类型");
} catch (IllegalAccessException e) {
System.out.println("衣服类型指定有误");
} catch (ClassNotFoundException e) {
System.out.println("指定衣服类型找不到");
}
return clothes;
}
}
5 调用方Caller
/**
* @Description: 调用方(main方法)
* @Author: qiuxx
* @Date: 22:04 2018/6/17
*/
public class Caller {
public static void main(String[] args){
System.out.println("------------生产西装--------");
Clothes suit = ClothesFactory.createClothes(Suit.class);
suit.clothingCategory();
suit.applicableOccasion();
System.out.println("------------生产羽绒服--------");
Clothes downJackets = ClothesFactory.createClothes(DownJackets.class);
downJackets.clothingCategory();
downJackets.applicableOccasion();
System.out.println("------------生产运动衫--------");
Clothes sportswear = ClothesFactory.createClothes(Sportswear.class);
sportswear.clothingCategory();
sportswear.applicableOccasion();
}
}
博客链接:https://qiuxx404.github.io/2018/06/18/原创/设计模式/设计模式-工厂模式