Android知识Android开发Android技术知识

工厂设计模式

2017-04-13  本文已影响73人  程序员丶星霖

工厂设计模式

工厂方法模式使用的频率非常高,其定义如下:

工厂方法的通用UML类图如下所示:

工厂方法.jpg

上图中各类的职责:

下面是一个比较实用的通用源码:

//抽象产品类
public abstract class Product{
    
    //产品的共性方法
    public void method_1(){
        //具体逻辑
    }

    //抽象方法
    public abstract void method_2();
}
//具体产品类可以有多个,都继承于抽象产品类
public class ConcreteProduct_1 extends Product{
    public void method_2(){
        //具体逻辑
    }
}

public class ConcreteProduct_2 extends Product{
    public void method_2(){
        //具体逻辑
    }
}

......
//抽象工厂类
public abstract class Creator{
    /**
    *创建一个产品对象,其输入参数类型可以自行设置
    *通常是String、Enume、Class等,也可以为空
    */
    public abstract <T extends Product> T createProduct(Class<T> c);
}
//具体工厂类
public class ConcreteCreator extends Creator{
    public abstract <T extends Product> T createProduct(Class<T> c){
        Product product = null;
        try{
            product = (Product)Class.forName(c.getName().newInstance);
        }catch(Exception e){
            //异常处理
        }
        return (T)product;
    }
}
//场景类
public class Client{
    public static void main(String[] args){
        Creator creator = new ConcreteCreator();
        Product product = creator.createProduct(ConcreteProduct1.class);
        //继续业务处理
    }
}

1.工厂方法模式的优点

2.工厂模式的使用场景

3.工厂方法模式的扩展

  1. 缩小为简单工厂模式
  2. 升级为多个工厂类
  3. 替代单例模式
  4. 延迟初始化

替代单例模式的代码示例:

//单例类
public class Singleton{
    //不允许通过new产生一个对象
    private Singleton(){

    }
    public void doSomrthing(){
        //业务处理
    }
}
//负责生产单例的工厂类
public class SingletonFactory{
    private static Singleton singleton;
    static{
        try{
            Calss cl = Class.forName(Singleton.class.getName());
            //获得无参构造
            Constructor constructor = c1.getDeclaredConstructor();
            //设置无参构造是可访问的
            constructor.setAccessible(true);
            //产生一个实例对象
            singleton = (Singleton)constructor.newInstance();
        }catch(Exception e){
            //异常处理
        }
    }

    public static Singleton getSingleton(){
        return singleton;
    }
}

简单工厂模式(Simple Factory Pattern)

这种模式属于类的创新型模式,也称静态工厂方法模式,通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

1.UML图示

简单工厂模式的UML图如下所示:

简单工厂.jpg

简单工厂模式中包含的角色及其相应的职责如下:

简单工厂模式的核心思想就是有一个专门的类来负责创建实例的过程。

2.简单工厂模式的优缺点

优点

缺点

温馨提示
严格意义上讲,简单工厂模式并不算是一种设计模式,简单工程模式更像是一种编程习惯。简单工厂模式不利于构建容易发生变化的系统。

示例代码如下:

public class IFood{
    void eat();
}
public class Chips implements IFood{
    
    public void eat(){
        System.out.println("我们吃到了薯条......");
    }
}
public class McChicken implements IFood{
    
    public void eat(){
        System.out.println("我们吃到了麦香鸡......");
    }
}
public class Mcdolad{
    
    public IFood getFood(String name){
        switch(name){
        case "chip":
            return new Chips();
            break;
        case "mcChicken":
            return new McChicken();
            break;
        default:
            System.out.println("我们不生产该产品....");
            break;
        }
    }
}
public class Client{
    public static void main(String[] args){
        Mcdolad mcdolad = new Mcdolad();

        IFood food = mcdolad.getFood("chip");
        if (food!=null){
            food.eat();
        }

        IFood food = mcdolad.getFood("mcChicken");
        if (food!=null){
            food.eat();
        }

        IFood food = mcdolad.getFood("kfcChicken");
        if (food!=null){
            food.eat();
        }
    }
}

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的。抽象工厂模式可以向客户端提供一个接口,是客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。
(Provide an interface for creating families of related or dependent objects without specifying their concrete classes 。)

1.抽象工厂模式的UML图示

抽象工厂.jpg

抽象工厂模式中的角色和其职责:

2.抽象工厂模式的优缺点

优点:

缺点:

注意:

与简单工厂的对比:

示例代码如下:

public interface IChips{
    public void eat();
}
public class MCchips implements IChips{
    
    public void eat(){
        System.out.println("吃到了MCchips....");
    }
}
public class KFCchips implements IChips{
    
    public void eat(){
        System.out.println("吃到了KFCchips....");
    }
}
public class DicosChips implements IChips{
    
    public void eat(){
        System.out.println("吃到了DicosChips....");
    }
}
public interface IStore{
    public IChips getChips();
}
public class Mcdonald implements IStore{
    
    public IChips getChips(){
        System.out.println("麦当劳生产了薯条....");
        return new MCchips();

    }
}
public class KFC implements IStore{
    
    public IChips getChips(){
        System.out.println("肯德基生产了薯条....");
        return new KFCchips();
    }
}
public class Dicos implements IStore{
    
    public IChips getChips(){
        System.out.println("德克士生产了薯条....");
        return new DicosChips();
    }
}
//场景类
public class Client{
    public static void main(String[] args){
        IStore store = new Dicos();
        store.getChips().eat();
    }
}

好了,先到这吧。欢迎大家关注我的微信公众号!!!

二维码.jpg
上一篇 下一篇

猜你喜欢

热点阅读