什么是工厂模式?
我们一般创建一个对象时一般是直接使用new()来创建,而对于我们需要大量或频繁创建某一类对象(通常是指实现了某一个接口的一些对象)时,这时再使用new()就显得繁琐切不宜维护了,这时我们就需要一个工厂来帮助我们创建这一类对象,这种设计模式就是工厂模式。
工厂模式有什么好处?
工厂模式最大的特点就是隐藏了new对象的过程与逻辑,如果你创建一个对象需要做许多的准备工作时,那么工厂模式是不错的选择,同时它也极大的减少了你的代码的维护难度:假如你在很多地方都用到了A对象,而你仅仅是在需要时new一个A对象出来,如果以后A对象的构造方法或者创建逻辑改变了(比如构造函数参数的变化,或者参数的获取方式有变),那么你需要在每一个new这个A对象的地方修改代码。但是如果你使用了工厂来创建这个对象,那么你只需要修改工厂的代码就行了。或者说你需要在不同的时候创建实现某一接口的不同对象,而不愿意做逻辑判断到底创建哪个对象时,使用工厂也能很好的做到这点。
下面来看如何落实到代码上:
首先我们把继承自同一个父类或者实现同一类接口的一些类称为同一类产品,把继承自不同父类的多个产品称为同一级产品
1.简单工厂方法
假如我需要创建青苹果和红苹果类,他们都继承于苹果类,那我可以写一个工厂根据传入的参数来帮我们创建这两种对象:
苹果代码就是很简单的继承,在此就略去了,下面来看工厂代码:
public class AppleFactory {
Apple apple;
public AppleFactory(){
}
public Apple getApple(String appleType){
if(appleType.equals("redApple")){
apple=new RedApple();
}
if(appleType.equals("greenApple")){
apple=new GreenApple();
}
return apple;
}
}
可以看到AppleFactory通过我传入的appleType来返回不同的对象
public class FactoryTest {
public static void main(String args[]){
AppleFactory appleFactory=new AppleFactory();
appleFactory.getApple("redApple");
appleFactory.getApple("greenApple");
}
}
输出(这里的输出是写在构造方法里的,当对象被创建时就会输出对应的语句):
红苹果出库
青苹果出库
简单工厂的特点就是只存在一个工厂来通过switch参数生产这一类对象
2.工厂方法模式
工厂代码:
首先创建一个抽象类来实现生产苹果接口
public interface GetApple {
Apple getApple();
}
public abstract class AppleFactory implements GetApple{
}
然后针对不同的对象来创建不同的工厂,也就是说产品和工厂是一对一关系
public class GreenAppleFactory extends AppleFactory{
@Override
public Apple getApple() {
// TODO Auto-generated method stub
return new GreenApple();
}
}
public class RedAppleFactory extends AppleFactory{
@Override
public Apple getApple() {
// TODO Auto-generated method stub
return new RedApple();
}
}
下面让我们来生产苹果吧:
public class MethodFactoryTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
RedAppleFactory redAppleFactory=new RedAppleFactory();
GreenAppleFactory greenAppleFactory=new GreenAppleFactory();
buyApple(redAppleFactory);
buyApple(greenAppleFactory);
}
private static void buyApple(AppleFactory factory){
factory.getApple();
}
}
输出:
红苹果出库
青苹果出库
那么工厂方法模式与简单工厂模式的区别就显而易见了,如果你要拓展工厂的产品,在简单工厂模式下你必须去修改原来的代码,这在代码维护中是不太好的行为,而使用简单工厂时你只需要新建一个工厂类就搞定了,并不需要动以前的代码
3.抽象工厂模式
如果说工厂方法模式是专注生产苹果的工厂,那么抽象工厂模式则用来创建生产多种产品的综合性工厂,它的特点是当你的产品的某一级拥有几类产品时,创建一个工厂即可。
首先创建一个抽象类代表要生产几类产品
public abstract class Factory {
abstract Apple getApple();
abstract Pear getPear();
}
然后根据要生产几级产品来创建几个工厂
public class FactoryOne extends Factory{
@Override
Apple getApple() {
// TODO Auto-generated method stub
return new RedApple();
}
@Override
Pear getPear() {
// TODO Auto-generated method stub
return new YellowPear();
}
}
public class FactoryTwo extends Factory{
@Override
Apple getApple() {
// TODO Auto-generated method stub
return new GreenApple();
}
@Override
Pear getPear() {
// TODO Auto-generated method stub
return new GreenPear();
}
}
这里我们只生产两级产品
public class FactoryTest {
public static void main(String args[]){
FactoryOne factoryone=new FactoryOne();
FactoryTwo factoryTwo=new FactoryTwo();
getProduts(factoryone);
getProduts(factoryTwo);
}
static void getProduts(Factory factory){
factory.getApple();
factory.getPear();
}
}
运行结果
红苹果出库
青苹果出库
下面是代码连接,需要的朋友可以下载:点击打开链接