初认识工厂模式
角色分配
- 抽象工厂
- 具体工厂
- 抽象产品
- 具体产品
用抽象来解耦我们用具体的代码来看下任务分配;
- 我们先来建立一个抽象产品类,抽象产品提供产品功能,不告知具体功能使用的结果
package pattern.factory;
/**
* Created by jsion on 16/8/24.
* 抽象产品,仿真女孩玩具俗称(Chongqi baby)
*/
public abstract class RealGirlProduct {
/**
* 抽象产品的具体作用
*/
public abstract void makeManHappy();
}
- 抽象工厂,提供工厂制造产品线的任务,都是生产congqi baby可能只有外形不一样,但是具体的功能还是统一的,所以抽象工厂提供的生产产品的方法就是抽象产品
package pattern.factory;
/**
* Created by jsion on 16/8/24.
* 抽象工厂,我们用泛型T来做一个泛型的限制,用于具体工厂方便返回
*/
public abstract class RealGirlFactory {
public abstract <T extends RealGirlProduct> T createRealGirl(Class<T> clz);
}
- 具体工厂,根据工厂的功能,不同的工厂最终生产的产品线都是一样的,都具有抽象工厂的功能
package pattern.factory;
/**
* Created by jsion on 16/8/24.
* 具体工厂实现了抽象工厂中的制作方法,根据不同的需求,制作不同的产品
*/
public class HappyRealFactory extends RealGirlFactory {
@Override
public <T extends RealGirlProduct> T createRealGirl(Class<T> clz) {
RealGirlProduct realGirlProduct = null;
if (null != clz) {
try {
realGirlProduct = (RealGirlProduct) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
return (T) realGirlProduct;
}
}
- 最后就是我们的具体产品类,但是不同的客户需求不一样,但是最终的功能肯定是抽象产品的功能,所以我们看下具体产品的类
package pattern.factory;
/**
* Created by jsion on 16/8/24.
*/
public class LinZhingLingReal extends RealGirlProduct {
@Override
public void makeManHappy() {
System.out.println("林志玲款式real---->make you happy!!");
}
}
package pattern.factory;
/**
* Created by jsion on 16/8/24.
*/
public class FangBingBingReal extends RealGirlProduct {
@Override
public void makeManHappy() {
System.out.println("仿真范冰冰款式--->>>make you happy!!");
}
}
package pattern.factory;
/**
* Created by jsion on 16/8/24.
*/
public class MaRongReal extends RealGirlProduct {
@Override
public void makeManHappy() {
System.out.println("马蓉真人--这个碧池--make every one happy!!");
}
}
从上面的可以看到不同的产品线有不同的产品,但是最终的功能都是抽象产品定义的那样!
ok到此为止我们的工厂模式各个角色都完善了,现在开始生产baby了,
public class ATPatternTest {
public static void main(String[] args) throws Exception {
/**
* 制造几个明星娃娃,传入客户需求
*/
RealGirlFactory realGirlFactory = new HappyRealFactory();
LinZhingLingReal linZhingLingReal = realGirlFactory.createRealGirl(LinZhingLingReal.class);
MaRongReal maRongReal = realGirlFactory.createRealGirl(MaRongReal.class);
FangBingBingReal fangBingBingReal = realGirlFactory.createRealGirl(FangBingBingReal.class);
/**
* 执行各位的工厂方法
*/
linZhingLingReal.makeManHappy();
fangBingBingReal.makeManHappy();
maRongReal.makeManHappy();
}
}
最后的结果就很明显了;不同的业务线生产不同的产品,都会具有抽象产品的功能
大家看下结果;