疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java基础工厂模式详解


 

 
通过学习,一句话概括Java工厂模式的特点——通过建立一个工厂来创建对象,不必关心构造对象实例能不能被实例化啊等诸多细节和复杂过程。
 
工厂模式呢?就像我们从劳动密集型社会转型到技术密集型社会。打个比方,从前要制造一个桌子,从上山选木头、砍木头、运木头,到设计桌子,制造桌子等细节问题都需要一个人去做好,由于付出的劳动成本极高和技术学成的时间等问题,一般一个木匠在创新方面有一定的局限性。后来,人们步入了工业时代,制造业的发展突飞猛进,另外,倡导分工细化。比如,电脑的制造厂商,它懂得怎样装好一部电脑和谁的零部件做的好,这个电脑厂商不必知道每个零部件的制作细节,但是,一样可以制造出来性能优越(算是一种取最优吧)的电脑。
 
一、工厂模式
 
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
 
二、工厂模式分为三类
 
1.简单工厂模式(Simple Factory)
 
2.工厂方法模式(Factory Method)
 
3.抽象工厂模式(Abstract Factory) 
 
这三种模式从上到下逐步抽象,并且更具一般性。
 
工厂方法模式:
 
一个抽象产品类,可以派生出多个具体产品类;  一个抽象工厂类,可以派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。
 
抽象工厂模式:
 
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;一个抽象工厂类,可以派生出多个具体工厂类;每个具体工厂类可以创建多个具体产品类的实例。  
 
三、简单工厂模式 
建立一个工厂(一个函数或一个类方法)来制造新的对象。
代码实例:
 
复制代码
 1 public class Dog {
 2     private String name;
 3     private String address;
 4 
 5     void shout() {
 6         System.out.println("汪汪汪~~");
 7     }
 8 
 9     public String getName() {
10         return name;
11     }
12 
13     public void setName(String name) {
14         this.name = name;
15     }
16 
17     public String getAddress() {
18         return address;
19     }
20 
21     public void setAddress(String address) {
22         this.address = address;
23     }
24 }
25 
26 class DogFactory {
27     static public Dog getDog() {
28         // return new Dog();
29         Dog dog = new Dog();
30         dog.setAddress("浙江杭州");
31         dog.setName("M.zhou");
32         return dog;
33     }
34 }
35 
36 class Test2 {
37     public static void main(String[] args) {
38         Dog dog = DogFactory.getDog();
39         Dog dog2 = DogFactory.getDog();
40         Dog dog3 = DogFactory.getDog();
41 
42         System.out.println(dog == dog2); // false
43     }
44 }
复制代码
四、工厂方法模式
 
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
 
工厂方法模式组成:
 
1.抽象工厂角色:
 
工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
 
2.具体工厂角色:
 
它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
 
3.抽象产品角色:
 
它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
 
4.具体产品角色:
 
具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
 
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来,前面学习过面向对象的三大特性,继承、封装和多态,工厂模式是将这三大特性集合起来的应用,同时工厂角色的结构也是符合开闭原则的。
 
下面举个例子:
 
复制代码
/*
 * @author M.zhou
 * @date 2017-7-1 下午 18:59
 * version 1.0
 * 
 */
 
//创建电脑制造工厂
public interface MyFactory {
    public MyBattery createBattery(); // 定义创建电池
 
    public MyDisplay createDisplay(); // 定义创建显示器
 
    public MyMotherBoard createMotherBorad(); // 定义创建主板
 
    public MyShell createShell(); // 定义创建外壳
}
复制代码
复制代码
//创建电脑原材料工厂,负责提供电池、显示屏、主板和外壳
public class ComFactory implements MyFactory {
 
    @Override
    public <MyBattery> MyBattery createBattery() {
        // TODO Auto-generated method stub
        return new SuperBattery;
    }
 
    @Override
    public MyDisplay createDisplay() {
        // TODO Auto-generated method stub
        return new SuperDisplay;
    }
 
    @Override
    public MyMotherBoard createMotherBorad() {
        // TODO Auto-generated method stub
        return  new SuperMotherBoard;
    }
 
    @Override
    public MyShell createShell() {
        // TODO Auto-generated method stub
        return new SuperShell;
    }
}
复制代码
//創建电脑装配厂的接口,只负责从原材料那里获取材料并配置成新型电脑。其他的它一概不管
public interface ComAssemblyPlant {
    public Computer Assembley();
    
}
复制代码
//新型电脑装配厂(可以根据市场需求,更换、升级零件,制造新型电脑)
public class NewComputerFactory implements ComAssemblyPlant {
    MyFactory materialFactory; // 原料工厂
 
    @Override
    
    public Computer Assembley() {
        Computer computer=new Computer();
        
        computer.setBattery(materialFactory.createBattery());
        computer.setDisplay(materialFactory.createDisplay());
        computer.setMotherBoard(materialFactory.createMotherBorad());
        computer.setShell(materialFactory.createShell());
        return computer;
        
        }
    
    }