zoukankan      html  css  js  c++  java
  • 工厂模式

    第二种方式:

    package com.dy.xidian;
    
    public class CarFactory {
        
        public static Car createAuDi(){
            return new AuDi();
        }
        
        public static Car createBiYaDi(){
            return new BiYaDi();
        }
    }

    工厂方法模式


    简单工厂中没添加一个新的类就需要去修改原有的工厂代码,这样的有点不好维护。

     为每个具体的类都定义了一个具体的工厂类,当我们有新的类时,只需要增加该类以及其工厂类就可以了。

    抽象工厂类:

    package com.dy.xidian;
    
    public interface CarFactory {
        public Car createCar();
    }

     具体工厂类:

    package com.dy.xidian;
    
    public class AuDiFactory implements CarFactory {
    
        @Override
        public Car createCar() {
            return new Audi();
        }
    
    }

    调用方式:

    public class Client{
      Car AuDi = new AuDiFactory.createCar();  
    }

     如果需要曾加一个大众,那么只需要增加两个类文件DaZhong.java以及DaZhongFactory.java就可以了。但是这样也有个问题,就是每次都要增加两个文件,当类的数量庞大的时候也不好管理,所以一般情况下选用简单工厂模式。

     抽象工厂模式


     简单工厂只能生产一种产品,比如发动机工厂只能生产发动机,轮胎工厂只能生产轮胎,汽车外壳工厂只能生产外壳。如果需要一个由这三种产品构成的一个小汽车的话就无能为力了,这就是设计的到产品族的概念。产品族是多种产品的有机组合,通过抽象工厂方法,我们可以将各个产品组合起来构成一个产品族,而在组合的时候用户可以自行选择各个产品,比如发动机可以选择比较好,而轮胎选择便宜的等等。

     

    Engine.java

    package com.dy.xidian;
    
    public interface Engine {
        void run();
        void start();
    }
    
    class LuxuryEngine implements Engine {
    
        @Override
        public void run() {
            System.out.println("跑得快");
        }
    
        @Override
        public void start() {
            System.out.println("启动快");
        }
    
    }
    
    class LowerEngine implements Engine {
    
        @Override
        public void run() {
            System.out.println("跑得慢");
        }
    
        @Override
        public void start() {
            System.out.println("启动慢");
        }
    }

    Seat.java

    package com.dy.xidian;
    
    public interface Seat {
    
        void comfortable();
    
    }
    
    class LuxurySeat implements Seat {
    
        @Override
        public void comfortable() {
            System.out.println("舒适");
        }
    }
    
    class LowerSeat implements Seat {
    
        @Override
        public void comfortable() {
            System.out.println("不舒适");
        }
    }

    Shell.java

    package com.dy.xidian;
    
    public interface Shell {
        public void meterial();
    }
    
    class LuxuryShell implements Shell {
    
        @Override
        public void meterial() {
            System.out.println("铁的");
        }
    }
    
    class LowerShell implements Shell {
    
        @Override
        public void meterial() {
            System.out.println("塑料的");
        }
    }

    CarFactory.java

    package com.dy.xidian;
    
    public interface CarFactory {
        Engine createEngine();
        Seat createSeat();
        Shell createShell();
    }

    LowerCarFactory.java

    package com.dy.xidian;
    
    public class LowerCarFactory implements CarFactory {
    
        @Override
        public Engine createEngine() {
            return new LowerEngine();
        }
    
        @Override
        public Seat createSeat() {
            return new LowerSeat();
        }
    
        @Override
        public Shell createShell() {
            return new LowerShell();
        }
    }

    LuxuryCarFactory.java

    package com.dy.xidian;
    
    public class LowerCarFactory implements CarFactory {
    
        @Override
        public Engine createEngine() {
            return new LowerEngine();
        }
    
        @Override
        public Seat createSeat() {
            return new LowerSeat();
        }
    
        @Override
        public Shell createShell() {
            return new LowerShell();
        }
    }

    MiddleCarFactory.java

    package com.dy.xidian;
    
    public class MiddleCarFactory implements CarFactory {
    
        @Override
        public Engine createEngine() {
            return new LowerEngine();
        }
    
        @Override
        public Seat createSeat() {
            return new LuxurySeat();
        }
    
        @Override
        public Shell createShell() {
            return new LowerShell();
        }
    }

     Client


    package com.dy.xidian;
    
    public class Client {
    
        public static void main(String[] args) {
    
            CarFactory factory = new LuxuryCarFactory();
            Engine e = factory.createEngine();
            Seat seat = factory.createSeat();
            Shell shell = factory.createShell();
            e.run();
            e.start();
            seat.comfortable();
            shell.meterial();
        }
    }

    创建一个高档汽车出来

     工厂模式要点


     

    简单工厂模式(静态工厂模式)

    • 某种程度不符合设计原则,但实际使用最多

    工厂方法模式

    • 不修改已有类的情况下通过增加新的工厂类实现扩展

    抽象工厂模式

    • 不可以增加产品,但可以增加产品族

    应用场景


    JDK中的Calendar的getInstance方法

    XML解析时的DocumentBuilerFactory创建解析器对象

    反射中Class对象的newInstance()

     

  • 相关阅读:
    为什么用户具有Full Controls权限,但还是不能创建页面
    采用Visual Studio 2008 开发工作流模板(三)
    采用Visual Studio 2008 开发工作流模板(五)
    简单学习SPNavigationNodeCollection
    SharePoint Designer工作流的扩展
    SmartQuery_v1.0下载
    如何使用SmartQueryWebPart
    c#生成日程表并实现根据差值获得日期
    Web开发常出现的错误[个人收集]
    System.Net.Mail 发送邮件示例
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5622690.html
Copyright © 2011-2022 走看看