工厂模式理解起来并不是很难 只要耐心看看代码 理解它的运作机理就好了。。。运用时就要看个人的灵活性了。
工厂是用来生产东西,但是从程序的角度讲就是 用一个工厂类来生产出你所需要的对象,这个生产出的对象可以是任意形式的 包括人,动物,水果,植物等不一定是要
机械性的东西 这是它跟现实工厂的区别之一。
产品是由工厂生产出来的 , 在程序里我们是new出来的,而在工厂模式里我们把这个new封装在了工厂类里面,用一个统一的工厂类来统一new 出这些产品
这样就达成一个共识,虽然代码写起来会很多,但是可以扩展你整个工厂的扩展性和规范性,因为你所有的产品都是由工厂统一new出来的 而不是任意一个开放
人员知道了这个产品的类,然后要做一个产品的时候 就是 产品A a = new 产品A();这样的形式来构建。 在工厂模式里就变成了 产品 a = Factory.Creat产品A();
直接看代码了类比较多 耐心开:
这里给出了 两个产品 一个是Light电灯 一个是Battery电池 还有两个工厂 分别来制造特定的产品 Light 有分为BuleLight和 RedLight ,Battery有分为GoodBattery
public interface Light
{
/*
* 对所有种类的电灯一个规范类
*/
public void doSomething();
}
public class RedLight implements Light
{
/*
* 红色电灯 基础电灯基本类是想抽象方法
*/
public RedLight(){
System.out.println("Create! RedLight");
}
public void doSomething(){
}
}
public class BuleLight implements Light
{
/*
* 蓝色电灯 基础电灯基本类是想抽象方法
*/
public BuleLight(){
System.out.println("Create BuleLight!");
}
public void doSomething(){
System.out.println("BuleLight! DoSomeThing!");
}
}
public interface Battery
{
/*
* 电池类基本类的规范
*/
public void doSomething();
}
public class GoodBattery implements Battery
{
/*
* 好的电池
*/
public GoodBattery(){
System.out.println("Create GoodBattery");
}
@Override
public void doSomething()
{
System.out.println("GoodBatteryt doSomething!");
}
}
public interface AbstractFactory { public Light CreateLight(); public Battery CreateBattery(); }
public class A_Factory implements AbstractFactory { /* * A工厂制作蓝色电灯和好的电池 */ @Override public Light CreateLight() { return new BuleLight(); } @Override public Battery CreateBattery() { return new GoodBattery(); } }
public class B_Factory implements AbstractFactory { /* * B工厂制作红色电灯和好的电池 */ @Override public Light CreateLight() { return new RedLight(); } @Override public Battery CreateBattery() { return new GoodBattery(); } }
public class Test { public static void main(String args[]) { /* * 测试类 */ A_Factory t = new A_Factory(); Light bule = t.CreateLight(); bule.doSomething(); Battery ba = t.CreateBattery(); ba.doSomething(); } }
输出结果:
Create BuleLight!
BuleLight! DoSomeThing!
Create GoodBattery
GoodBatteryt doSomething!