码迷,mamicode.com
首页 > 其他好文 > 详细

工厂模式

时间:2018-02-10 23:25:02      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:分享图片   div   ring   面向   int   name   access   pos   概念   

什么是工厂模式呢?

工厂模式最主要的功能就是降低了类之间的耦合度(将类的实例化,类的使用通过一个中间工厂类分离开来),体现了面向对象的思想;

比如有A,B类一般我们会这样使用

class A{
    B b = new B();
     b.XX();
}
class B{
  public void XX(){
  }
}

但是这样的话就是在A中实例化B,并且使用B的方法,使得类的耦合度很高,如果B类使用的很频繁,一旦需要对B进行修改或者替换,

就得在使用B的地方全部修改,还有一点,如果B类的实例化需要大量的初始化代码(比如数据库类的初始化需要较多的代码),那么

每初始一次B类就有大量代码重复,且不易于维护,所以呢使用工厂类可以很好的解决这些问题。

工厂模式的几种设计方法:

1:简单工厂模式

//简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。
//工厂类,用于实例化对象(生产产品)并做初始化
public class A {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        C product2 = Factory2.setObject(1);
        product2.sounds();
        C product1 = Factory1.setObject("com._520it.E");
        product1.sounds();
    }
}

//使用反射机制简化了简单工厂模式,在添加了一个新的产品类后,不需要在工厂中修改,就可以生产
class Factory1{
    public static C setObject(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
        //注意className是类的全称:包名.类名
        C product = (C)Class.forName(className).newInstance();
        return product;

    }
}

//简单工厂模式,根据输入参数选择生成对象
class Factory2{
    public static C setObject(int i){
        if(i == 1){
            return new B();//如果传入的参数是1,返回B对象
        }else{
            return new D();//本来这里应该对参数可能出现的问题进行throw
        }
    }
}


//抽象产品,只有一个大概的概念
interface C{
    public void sounds();
}

//具体产品
class B implements C{
    public void sounds() {
        System.out.println("发出声音-汪汪");
    }
}

//具体产品
class E implements C{
    public void sounds() {
        System.out.println("发出声音-嗡嗡");
    }
}

//具体产品
class D implements C{
    public void sounds() {
        System.out.println("发出声音-喵喵");
    }
}

 

 2:普通工厂模式:

工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,

而是只制定一些规范,具体的生产工作由其子类去完成。就是不再直接定义一个工厂类来生产具体的产品,而是通过抽象化一个工厂类,来制定一些产品制作的规范,

具体的生产产品的工作交给继承了它的子类去做。

技术分享图片

public class A {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        Factory3 aaa = new Factory3();
        aaa.setObject().sounds();
        Factory4 bbb = new Factory4();
        bbb.setObject().sounds();
        Factory5 ccc = new Factory5();
        ccc.setObject().sounds();
    }
}


//普通工厂方法:它不再直接实现产品,而是通过其子类生产
interface  Factory2{
    public C setObject();
        ...
}

//通过抽象方法可以子类实现对setObject();方法的重写
class Factory3 implements Factory2{
    public C setObject() {
        return new B();
    }
}

class Factory4 implements Factory2{
    public C setObject() {
        return new D();
    }
}

class Factory5 implements Factory2{
    public C setObject() {
        return new E();
    }
}

//抽象产品,只有一个大概的概念
interface C{
    public void sounds();
}

//具体产品
class B implements C{
    public void sounds() {
        System.out.println("发出声音-汪汪");
    }
}

//具体产品
class E implements C{
    public void sounds() {
        System.out.println("发出声音-嗡嗡");
    }
}

//具体产品
class D implements C{
    public void sounds() {
        System.out.println("发出声音-喵喵");
    }
}

3:抽象工厂模式:

假如一个工厂除了生产A种类型的产品外,还要增加生产B种类型的产品,这时就使用到了抽象工厂类。

public class A {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        Factory2 aaa = new Factory3();
        aaa.setBike().bike();
        aaa.setCar().car();
    }
}

//抽象工厂模式:可以同时生产多个不同类型的产品
interface  Factory2{
    public Car setCar();
    public Bike setBike();
}

//具体工厂
class Factory3 implements Factory2{

    @Override
    public Car setCar() {
        return new BigCar();
    }

    @Override
    public Bike setBike() {
        return new BigBike();
    }
    
}

//抽象产品,只有一个大概的概念
interface Car{
    public void car();
}

//具体产品
class BigCar implements Car{
    public void car() {
        System.out.println("制造了一辆汽车");
    }
}

//抽象产品,只有一个大概的概念
interface Bike{
    public void bike();
}

//具体产品
class BigBike implements Bike{
    public void bike() {
        System.out.println("制造了一辆自行车");
    }
}

需要注意的是,不能滥用工厂模式来,因为使用这个模式其实是体现了面向对象的思想,但是对于那些构造简单,不太变动的类来说,再另外设计一个工厂模式专门来

实例化和初始化显得太麻烦。

参考文章:

http://blog.csdn.net/lovelion/article/details/7523392

http://blog.csdn.net/CHBSRZF/article/details/48522655

 

工厂模式

标签:分享图片   div   ring   面向   int   name   access   pos   概念   

原文地址:https://www.cnblogs.com/dtx0/p/8439909.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!