public class Main {public static void main(String[] args) {Car car = new Car();// OxCart car = new OxCart();car.go()}}
当对对象(Car,Palne….等等)进行权限控制时,每个对象的权限是不一样的,会写很多代码,改其不方便
所以用一个简单工厂生成对应的对象(相当于把创建对象时执行的操作抽成一个方法)
public class SimpleFactory {Car createCar(){//setName()...return new Car();};OxCart createOxCart(){//setName()...return new OxCart();};Sword createSword() {//setName()...return new Sword();}Gun createGun() {//setName()...return new Gun();}//...N}
如果有很多类,这样这个简单工厂类就会很臃肿,不利于理解,开发和维护。面对杂乱的信息,分组、分类可以减少信息密度,有助于我们去理解其内在逻辑,接口和抽象类就是编程语言提供的工具,让我们去标识、分组这些类,更好的表达程序思路。
例如
在现实中Car和OxCart可以根据特征,分到可移动的分组里,就可以用这个分组来代表Car和OxCart,Sword(长剑)、Gun可以归为Arms(武器)分组
在代码中就可以这样表示:
public interface Moveable {void move();}public abstract class Arms {abstract void attack();}public class Car implements Moveable {public void move() {System.out.println("Car go wuwuwuwuw....");}}public class OxCart implements Moveable {public void move() {System.out.println("OxCart flying shushua....");}}public class Sword extends Arms {public void attack() {System.out.println("kankankan....");}}public class Gun extends Arms {public void attack() {System.out.println("pangpang....");}}
现在我们已经分为 Moveable 和Arms,所以可以用它们代表各自分组类,那SimpleFactory按理可以写成以下伪代码:
public class SimpleFactory {Moveable createMoveable(){//setName()...return new Moveable();};Arms createArms(){//setName()...return new Arms();};}
现实世界中,分组名(抽象化的) 本身并没有直接对应真实事物,所以编程语言中,接口/抽象类是不能直接实例化的,所以我们改成:
public abstract class AbastractFactory {
abstract Moveable createMoveable();// 2种
abstract Arms createArms();// 2种
}
这样当我们实现时就有 22=4种组合,也就是4个工厂类,他们都可以用AbastractFactory代表。这4种组合中如果有共同的特征,就可以再次分组,但是在这里两个特征就可以锁定唯一类,那就不用再继续抽象下去了(*抽象是为了代表多个对象),比如:
满足武器Arms 和现代的(Modern)属性的 ,那就只有Gun, 满足可移动的(Moveable)和现代的(Modern)只有Car
public class ModernFactory extends AbastractFactory {
@Override
Arms createArms() {
return new Gun();
}
@Override
Moveable createMoveable() {
return new Car();
}
}
