设计模式最佳实之工厂模式

原文地址:设计模式最佳实之工厂模式

设计模式.jpg

What

工厂模式:
是创建型设计模式,用于创建对象的接口,让子类决定new那个类的实例

使用场景:

  • 在任何需要生成需要生成复杂对象的地方,都可以考虑使用工程模式
  • 复杂对象适合使用工厂模式,用new就可以完成创建的对象则无需使用工厂模式

UML图

工厂模式UML.png

How

代码例子
  • 首先定义工厂抽象类

    • Factory
    public abstract class Factory{
        /**
         * 抽象工厂方法
         * 具体生产什么产品由子类决定
         * return product
         */
        public abstract Product createProduct(Class<T> clz);
    }
  • 定义工厂实现类,根据传入工厂实现类型生产相应的产品

    • 使用反射的方法,减少冗余的工厂实现类
    • FactoryImp
    public class FactoryImp extends Factory{
        /**
         * 具体的工厂
         * 根据传入的产品类型返回相应的产品
         * return product
         */
        public <T extends Product> createProduct(Class<T> clz){
            Product p = null;
            try{
                p = (Product)class.forName(clz.getName()).newInstance();
            }catch(Execption e){
            }
            return p;
        };
    }
  • 定义产品抽象类

    • Product
    public abstract class Product{
        public abstract void method();
    }
  • 定义产品A

    • ProductA
    public class ProductA extends Product{
        public void method(){
            System.out.println("I am a product A!!");
        }
    }
  • 定义产品B

    • ProductB
    public class ProductB extends Product{
        public void method(){
            System.out.println("I am a product B!!");
        }
    }
  • 测试例子:

    public static void main(String[] args) {
            Factory factory = new FactoryImp();
            // 生产ProductA
            Product pA = factory.createProduct(ProductA.class);
            pA.method();
    
            // 生产ProductB
            Product pB = factory.createProduct(ProductB.class);
            pB.method();
        }
  • 结果:

    I am a product A!!
    I am a product B!!

总结

  • 优点
    • 从上面的例子可以看出,工厂模式是一个很好设计模式,能够很好解耦工厂与产品之间关系,通过接口/抽象类指定规范,只需替换相应的实现即可完成替换,很好符合了设计模式原则的开闭原则,对拓展开放,对修改关闭
    • 减少if...elase形式的硬编码判断,逻辑更加清晰简洁
  • 缺点
    • 会产生过多的产品类,导致类结构的复杂化,每新增一款产品,就需要写一个新的产品类

如果对我的文章有什么建议的,可以留言给我,我都会回复,并虚心接受,只为把最好的献给最好可爱的你们~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值