栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java设计模式——工厂设计模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java设计模式——工厂设计模式

目录
  • 定义
  • 简单工厂模式
    • 利用反射实现简单工厂设计模式
  • 工厂方法模式

定义

什么是工厂设计模式?
生活中:批量生产产品
Java中:批量生产对象

好处:
为了解耦合,把对象的创建者与对象的使用者分开。

Java:
没有工厂,需要对象,自己new。
如果把生产(创建)对象与使用对象分开了,可以解耦合

简单工厂模式
public class TestFactory {
    @Test
    public void test03(){
        Car c = SimpleFactory.getCar("奔驰");
        c.run();
    }
    @Test
    public void test01(){
        //没有工厂
        BMW b = new BMW();
        //使用对象,调用方法
        b.run();
    }
}
    interface Car{
        void run();
    }
    class BMW implements Car{
        @Override
        public void run() {
            System.out.println("宝马让你在车里面哭");
        }
    }
    class Benz implements Car{
        @Override
        public void run() {
            System.out.println("奔驰让你在车盖上哭");
        }
    }
    class Audi implements Car{
        @Override
        public void run() {
            System.out.println("奥迪让你在...");
        }
    }//如果增加了Audi类,则需要继续更改SimpleFactory类
    
class SimpleFactory{
    public static Car getCar(String type){
        if("宝马".equals(type)){
            return new BMW();
        }else if("奔驰".equals(type)){
            return new Benz();
        }
        return null;
    }
}

优点:代码比较简洁
缺点:如果增加新的产品类型,需要修改工厂类,违反了面向对象的一个开发原则:对扩展开放,对修改关闭。

利用反射实现简单工厂设计模式

为了解决对于工厂类的修改,可以使用反射实现工厂类。

public class TestFactory3 {
    public static void main(String[] args) throws Exception {
        Vehicle c = SimpleFactory3.getVehicle("main.Aoto");
        c.run();//奥拓

        Vehicle c2 = SimpleFactory3.getVehicle("main.QQ");
        c2.run();//qq车
    }
}
interface Vehicle {
    void run();
}
class QQ implements Vehicle {
    @Override
    public void run() {
        System.out.println("qq车");
    }
}

class Aoto implements Vehicle {
    @Override
    public void run() {
        System.out.println("奥拓");
    }
}

class SimpleFactory3 {
    public static Vehicle getVehicle(String className) throws Exception {
        Class clazz = Class.forName(className);
        return (Vehicle) clazz.newInstance();
    }
}
工厂方法模式

(1)生产对象与使用对象分开
(2)如果增加新产品,且不需要修改原来的工厂类

public class TestFactory2 {
    public static void main(String[] args) {
        BaoMaFactory bf = new BaoMaFactory();
        Che c = bf.getChe();
        c.run();//宝马
    }
}
interface Che{
    void run();
}
class BaoMa implements Che{
    @Override
    public void run() {
        System.out.println("宝马");
    }
}

class BenChi implements Che{
    @Override
    public void run() {
        System.out.println("奔驰");
    }
}
class AoDi implements Che{
    @Override
    public void run() {
        System.out.println("奥迪");
    }
}

interface GongChang{
   public abstract Che getChe();
}
class BaoMaFactory implements GongChang{
    @Override
    public Che getChe() {
        return new BaoMa();
    }
}
class BenChiFactory implements  GongChang{
    @Override
    public Che getChe() {
        return new BenChi();
    }
}

优点:遵循了增加新产品,不修改原来的类的原则,
缺点:工厂类过多

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/328646.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号