1. public class Main {
    2. public static void main(String[] args) {
    3. Car car = new Car();
    4. // OxCart car = new OxCart();
    5. car.go()
    6. }
    7. }

    当对对象(Car,Palne….等等)进行权限控制时,每个对象的权限是不一样的,会写很多代码,改其不方便
    所以用一个简单工厂生成对应的对象(相当于把创建对象时执行的操作抽成一个方法

    1. public class SimpleFactory {
    2. Car createCar(){
    3. //setName()...
    4. return new Car();
    5. };
    6. OxCart createOxCart(){
    7. //setName()...
    8. return new OxCart();
    9. };
    10. Sword createSword() {
    11. //setName()...
    12. return new Sword();
    13. }
    14. Gun createGun() {
    15. //setName()...
    16. return new Gun();
    17. }
    18. //...N
    19. }

    如果有很多类,这样这个简单工厂类就会很臃肿,不利于理解,开发和维护。面对杂乱的信息,分组、分类可以减少信息密度,有助于我们去理解其内在逻辑,接口和抽象类就是编程语言提供的工具,让我们去标识、分组这些类,更好的表达程序思路。
    例如
    在现实中CarOxCart可以根据特征,分到可移动的分组里,就可以用这个分组来代表CarOxCartSword(长剑)、Gun可以归为Arms(武器)分组
    在代码中就可以这样表示:

    1. public interface Moveable {
    2. void move();
    3. }
    4. public abstract class Arms {
    5. abstract void attack();
    6. }
    7. public class Car implements Moveable {
    8. public void move() {
    9. System.out.println("Car go wuwuwuwuw....");
    10. }
    11. }
    12. public class OxCart implements Moveable {
    13. public void move() {
    14. System.out.println("OxCart flying shushua....");
    15. }
    16. }
    17. public class Sword extends Arms {
    18. public void attack() {
    19. System.out.println("kankankan....");
    20. }
    21. }
    22. public class Gun extends Arms {
    23. public void attack() {
    24. System.out.println("pangpang....");
    25. }
    26. }

    现在我们已经分为 MoveableArms,所以可以用它们代表各自分组类,那SimpleFactory按理可以写成以下伪代码:

    1. public class SimpleFactory {
    2. Moveable createMoveable(){
    3. //setName()...
    4. return new Moveable();
    5. };
    6. Arms createArms(){
    7. //setName()...
    8. return new Arms();
    9. };
    10. }

    现实世界中,分组名(抽象化的) 本身并没有直接对应真实事物,所以编程语言中,接口/抽象类是不能直接实例化的,所以我们改成:

    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();
        }
    }