• 设计模式之工厂模式(2)


    前一篇提到了静态工厂(也称为普通工厂),单例模式

    这一篇来谈谈抽象工厂(面向抽象类编程,故名思意)。

    我现在有一系列的产品 Car Ak47 Apple Computer...

    简单起见就取前两个。。程序员就是爱偷懒。。莫怪。

    小二,先来一个抽象类:Vehicle:

    package cn.asto.abs;
    
    public abstract class Vehicle {
    
        public abstract void move();
    }

    客官来了,一个实现Vehicle的类:

    package cn.asto.abs;
    
    public class Car extends Vehicle {
    
        @Override
        public void move() {
            System.out.println("Car is running");
        }
    
    }

    照样画葫芦 搞一对关于Ak47的,

    package cn.asto.abs;
    
    public abstract class  Weapon {
    
        public abstract void shoot();
    }
    package cn.asto.abs;
    
    public class AK47 extends Weapon{
    
        @Override
        public void shoot() {
            System.out.println("Ak47 is shoot!");
            
        }
    
        
    }

    这一系列产品总得有人管理吧,主角登场即将登场,先定义一个抽象工厂:

    package cn.asto.abs;
    
    public abstract class AbstractFactory {
    
        public abstract Vehicle createVehcle();
        public abstract Weapon createWeapon();
        
    }

     写到这里终于轮到工厂出马了:

    DefaultFactory:

    package cn.asto.abs;
    
    public class DefaultFactory extends AbstractFactory{
    
        @Override
        public Vehicle createVehcle() {
            // TODO Auto-generated method stub
            return new Car();
        }
    
        @Override
        public Weapon createWeapon() {
            // TODO Auto-generated method stub
            return new AK47();
        }
    
    }

    Test:

    package cn.asto.abs;
    
    public class Test {
    
        public static void main(String args[]){
            AbstractFactory factory = new DefaultFactory();
            Vehicle car = factory.createVehcle();
            car.move();
            Weapon ak47 =factory.createWeapon();
            ak47.shoot();
        }
        
    }

    输出:

    Car is running
    Ak47 is shoot!

    让我感慨一下,java的多态设计真的是牛的一逼啊!

    现在这个DefaultFactory工厂就可以create一系列的bean了。

    假如我现在想换一套bean,比如MaggicFactory,

    先来两个实体类 分别实现Vehicle 和Weapon

    package cn.asto.abs;
    
    public class MagicCar extends Vehicle{
    
        @Override
        public void move() {
            System.out.println("MagicCar is runing");
            
        }
    
    }
    package cn.asto.abs;
    
    public class MagicAK47 extends Weapon{
    
        @Override
        public void shoot() {
            System.out.println("MagicAk47 is shoot!");
            
        }
    
        
    }

    现在再来一个工厂类:

    package cn.asto.abs;
    
    public class MagicFactory extends AbstractFactory {
    
        @Override
        public Vehicle createVehcle() {
            
            return new MagicCar();
        }
    
        @Override
        public Weapon createWeapon() {
            
            return new MagicAK47();
        }
    
    }

    我在Test里面只要换一句话,就可以实现更换一系列的产品了,注意看下面的代码:

    package cn.asto.abs;
    
    public class Test {
    
        public static void main(String args[]){
            //AbstractFactory factory = new DefaultFactory();
            AbstractFactory factory = new MagicFactory();
            Vehicle car = factory.createVehcle();
            car.move();
            Weapon ak47 =factory.createWeapon();
            ak47.shoot();
        }
        
    }

    是吧,其实我只需要更改后面new的对象就可以。再次感谢java的多态!让我这么简单地就更换了一系列的产品。

    come back to console:

    MagicCar is runing
    MagicAk47 is shoot!


    现在抛开具体的实现,我想对比一下抽象工厂和静态工厂(普通工厂)的优缺点:

    1. 静态工厂:当增加一系列产品的时候,就需要对应地写出一系列的Factory,类爆炸,但是在添加单个产品的时候,非常地方便
    2. 抽象工厂:当增加一个产品的时候,比较麻烦,首先你要写一个抽象产品,然后实现它,接着你需要在抽象工厂类中新建立一个方法,用于create new Bean,接着你还要在所有的具体的工厂类中去实现这个方法,但是用于一系列产品的替换的时候,就非常方便

      所以要我说吧,静态工厂适用于生产单系列的的产品,并且在后续的开发中,很少出现一系列的产品,而抽象工厂适用于一系列的产品,经常性要替换掉一系列的产品,最好还不存在单个产品的增删改查。


    站在哲学的角度上看,事物是相对的,没有什么永远是对,是好的!

    在不同的地点,不同的人,不同的时间,可能完全是另一个世界! 好吧我承认我装B了,洗洗睡吧!

  • 相关阅读:
    Spring Session Logout
    VC6.0 error LNK2001: unresolved external symbol _main解决办法
    JDBC数据库编程基本流程
    JDBC连接SQL Server2008
    JDK的下载、安装及环境变量的配置
    奇数阶幻方口诀
    ping: sendto: Network is unreachable
    new/delete和malloc/free的区别
    MFC的消息管理
    VC++之自定义消息
  • 原文地址:https://www.cnblogs.com/think-in-java/p/4751427.html
Copyright © 2020-2023  润新知